精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

分布式事務(wù)解決方案:深入理解 TCC 模式

開發(fā)
TCC 是一種強大的分布式事務(wù)解決方案,它通過巧妙的補償機制來保證事務(wù)的一致性。雖然實現(xiàn)較為復(fù)雜,但在某些場景下是不可替代的選擇。

在分布式系統(tǒng)中,事務(wù)處理一直是一個復(fù)雜的話題。想象一下,當(dāng)你在網(wǎng)上商城購物時,整個過程涉及:

  • 訂單系統(tǒng)創(chuàng)建訂單
  • 庫存系統(tǒng)扣減庫存
  • 支付系統(tǒng)完成支付
  • 積分系統(tǒng)增加積分

這些操作分布在不同的服務(wù)中,如何保證它們要么全部成功,要么全部失敗?這就是分布式事務(wù)需要解決的問題。

一、分布式事務(wù)的挑戰(zhàn)

1.傳統(tǒng)事務(wù)的局限

在單體應(yīng)用中,我們習(xí)慣使用數(shù)據(jù)庫的 ACID 事務(wù):

@Transactional
public void createOrder(Order order) {
    // 創(chuàng)建訂單
    orderRepository.save(order);
    // 扣減庫存
    inventoryRepository.deduct(order.getProductId(), order.getQuantity());
    // 扣減余額
    accountRepository.deduct(order.getUserId(), order.getAmount());
}

但在分布式環(huán)境下,這種方式行不通了,因為:

  • 跨多個數(shù)據(jù)庫
  • 跨多個服務(wù)
  • 網(wǎng)絡(luò)可能失敗
  • 服務(wù)可能宕機

2.CAP 理論的限制

在分布式系統(tǒng)中,我們不得不在以下三個特性中做出選擇:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分區(qū)容錯性(Partition tolerance)

二、TCC 模式介紹

1.什么是 TCC?

TCC(Try-Confirm-Cancel)是一種補償性事務(wù)模式,它將一個完整的業(yè)務(wù)操作分為二步完成:

(1) Try: 嘗試執(zhí)行業(yè)務(wù)

  • 完成所有業(yè)務(wù)檢查
  • 預(yù)留必要的業(yè)務(wù)資源

(2) Confirm: 確認(rèn)執(zhí)行業(yè)務(wù)

  • 真正執(zhí)行業(yè)務(wù)
  • 不做任何業(yè)務(wù)檢查
  • 只使用 Try 階段預(yù)留的資源

(3) Cancel: 取消執(zhí)行業(yè)務(wù)

  • 釋放 Try 階段預(yù)留的資源
  • 回滾操作

來源:seata

2.TCC 示例:訂單支付流程

讓我們通過一個具體的訂單支付場景來理解 TCC:

// 訂單服務(wù)的 TCC 實現(xiàn)
public class OrderTccService {
    
    // Try: 創(chuàng)建預(yù)訂單
    @Transactional
    public void tryCreate(Order order) {
        // 檢查訂單參數(shù)
        validateOrder(order);
        // 創(chuàng)建預(yù)訂單
        order.setStatus(OrderStatus.TRYING);
        orderRepository.save(order);
    }
    
    // Confirm: 確認(rèn)訂單
    @Transactional
    public void confirmCreate(String orderId) {
        Order order = orderRepository.findById(orderId);
        order.setStatus(OrderStatus.CONFIRMED);
        orderRepository.save(order);
    }
    
    // Cancel: 取消訂單
    @Transactional
    public void cancelCreate(String orderId) {
        Order order = orderRepository.findById(orderId);
        order.setStatus(OrderStatus.CANCELLED);
        orderRepository.save(order);
    }
}

// 庫存服務(wù)的 TCC 實現(xiàn)
public class InventoryTccService {
    
    // Try: 凍結(jié)庫存
    @Transactional
    public void tryDeduct(String productId, int quantity) {
        Inventory inventory = inventoryRepository.findById(productId);
        // 檢查并凍結(jié)庫存
        if (inventory.getAvailable() < quantity) {
            throw new InsufficientInventoryException();
        }
        inventory.setFrozen(inventory.getFrozen() + quantity);
        inventory.setAvailable(inventory.getAvailable() - quantity);
        inventoryRepository.save(inventory);
    }
    
    // Confirm: 確認(rèn)扣減
    @Transactional
    public void confirmDeduct(String productId, int quantity) {
        Inventory inventory = inventoryRepository.findById(productId);
        inventory.setFrozen(inventory.getFrozen() - quantity);
        inventoryRepository.save(inventory);
    }
    
    // Cancel: 解凍庫存
    @Transactional
    public void cancelDeduct(String productId, int quantity) {
        Inventory inventory = inventoryRepository.findById(productId);
        inventory.setFrozen(inventory.getFrozen() - quantity);
        inventory.setAvailable(inventory.getAvailable() + quantity);
        inventoryRepository.save(inventory);
    }
}

// 支付服務(wù)的 TCC 實現(xiàn)
public class PaymentTccService {
    
    // Try: 凍結(jié)金額
    @Transactional
    public void tryDeduct(String userId, BigDecimal amount) {
        Account account = accountRepository.findById(userId);
        // 檢查并凍結(jié)金額
        if (account.getAvailable().compareTo(amount) < 0) {
            throw new InsufficientBalanceException();
        }
        account.setFrozen(account.getFrozen().add(amount));
        account.setAvailable(account.getAvailable().subtract(amount));
        accountRepository.save(account);
    }
    
    // Confirm: 確認(rèn)支付
    @Transactional
    public void confirmDeduct(String userId, BigDecimal amount) {
        Account account = accountRepository.findById(userId);
        account.setFrozen(account.getFrozen().subtract(amount));
        accountRepository.save(account);
    }
    
    // Cancel: 解凍金額
    @Transactional
    public void cancelDeduct(String userId, BigDecimal amount) {
        Account account = accountRepository.findById(userId);
        account.setFrozen(account.getFrozen().subtract(amount));
        account.setAvailable(account.getAvailable().add(amount));
        accountRepository.save(account);
    }
}

3.TCC 事務(wù)協(xié)調(diào)器

為了協(xié)調(diào)整個 TCC 流程,我們需要一個事務(wù)協(xié)調(diào)器:

@Service
public class OrderTccCoordinator {
    
    @Autowired
    private OrderTccService orderService;
    
    @Autowired
    private InventoryTccService inventoryService;
    
    @Autowired
    private PaymentTccService paymentService;
    
    public void createOrder(Order order) {
        String xid = generateTransactionId();
        
        try {
            // ==== Try 階段 ====
            // 1. 創(chuàng)建預(yù)訂單
            orderService.tryCreate(order);
            
            // 2. 嘗試扣減庫存
            inventoryService.tryDeduct(
                order.getProductId(), 
                order.getQuantity()
            );
            
            // 3. 嘗試扣減余額
            paymentService.tryDeduct(
                order.getUserId(), 
                order.getAmount()
            );
            
            // ==== Confirm 階段 ====
            // 1. 確認(rèn)訂單
            orderService.confirmCreate(order.getId());
            
            // 2. 確認(rèn)庫存扣減
            inventoryService.confirmDeduct(
                order.getProductId(), 
                order.getQuantity()
            );
            
            // 3. 確認(rèn)支付
            paymentService.confirmDeduct(
                order.getUserId(), 
                order.getAmount()
            );
            
        } catch (Exception e) {
            // ==== Cancel 階段 ====
            // 1. 取消訂單
            orderService.cancelCreate(order.getId());
            
            // 2. 恢復(fù)庫存
            inventoryService.cancelDeduct(
                order.getProductId(), 
                order.getQuantity()
            );
            
            // 3. 恢復(fù)余額
            paymentService.cancelDeduct(
                order.getUserId(), 
                order.getAmount()
            );
            
            throw new OrderCreateFailedException(e);
        }
    }
}

三、TCC 實現(xiàn)要點

1. 業(yè)務(wù)模型設(shè)計

在實現(xiàn) TCC 時,業(yè)務(wù)模型需要考慮預(yù)留資源的狀態(tài):

public class Inventory {
    private String productId;
    private int total;      // 總庫存
    private int available;  // 可用庫存
    private int frozen;     // 凍結(jié)庫存
}

public class Account {
    private String userId;
    private BigDecimal total;     // 總額
    private BigDecimal available; // 可用余額
    private BigDecimal frozen;    // 凍結(jié)金額
}

圖 3: TCC 中的資源狀態(tài)變化,來源 seata

2. 冪等性設(shè)計

所有操作都需要保證冪等,因為在網(wǎng)絡(luò)異常時可能會重試:

@Transactional
public void tryDeduct(String userId, BigDecimal amount, String xid) {
    // 檢查是否已經(jīng)執(zhí)行過
    if (tccLogRepository.existsByXidAndPhase(xid, "try")) {
        return;
    }
    
    // 執(zhí)行業(yè)務(wù)邏輯
    Account account = accountRepository.findById(userId);
    account.setFrozen(account.getFrozen().add(amount));
    account.setAvailable(account.getAvailable().subtract(amount));
    accountRepository.save(account);
    
    // 記錄執(zhí)行日志
    tccLogRepository.s

3. 防懸掛設(shè)計

(1) 為什么需要防懸掛?

在分布式系統(tǒng)中,網(wǎng)絡(luò)延遲、服務(wù)故障等原因可能導(dǎo)致一個奇怪的現(xiàn)象,Cancel 操作比 Try 操作先執(zhí)行。這就是所謂的"懸掛"問題。具體場景如下:

事務(wù)管理器在調(diào)用 TCC 服務(wù)的一階段 Try 操作時事務(wù)時,由于網(wǎng)絡(luò)擁堵,Try 請求沒有及時到達,事務(wù)管理器超時后,發(fā)起了 Cancel 請求完成后,此時原來的 Try 請求才到達,如果在執(zhí)行這個延遲的 Try 請求,將導(dǎo)致資源被錯誤鎖定

*圖: TCC 懸掛問題示意圖,來源:seata

(2) 解決方案

核心思路是記錄每個事務(wù)的執(zhí)行狀態(tài),并在執(zhí)行 Try 操作前進行檢查:

@Service
public class TccTransactionService {
    
    @Autowired
    private TccLogRepository tccLogRepository;
    
    @Transactional
    public void tryDeduct(String userId, BigDecimal amount, String xid) {
        // 1. 檢查是否已經(jīng)被 Cancel
        if (tccLogRepository.existsByXidAndPhase(xid, "cancel")) {
            throw new TransactionCancelledException("Transaction already cancelled");
        }
        
        // 2. 檢查是否已經(jīng)執(zhí)行過 Try (冪等性檢查)
        if (tccLogRepository.existsByXidAndPhase(xid, "try")) {
            return;
        }
        
        // 3. 執(zhí)行業(yè)務(wù)邏輯
        Account account = accountRepository.findById(userId);
        if (account.getAvailable().compareTo(amount) < 0) {
            throw new InsufficientBalanceException();
        }
        
        // 4. 記錄執(zhí)行日志
        account.setFrozen(account.getFrozen().add(amount));
        account.setAvailable(account.getAvailable().subtract(amount));
        accountRepository.save(account);
        tccLogRepository.save(new TccLog(xid, "try"));
    }
}

4. 超時處理

(1) 為什么需要超時處理?

在分布式環(huán)境下,超時是不可避免的,可能由于以下原因?qū)е?

  • 網(wǎng)絡(luò)延遲或故障
  • 服務(wù)器負(fù)載過高
  • 服務(wù)進程崩潰
  • 死鎖

如果不處理超時,會造成嚴(yán)重后果:

  • 資源被無限期鎖定
  • 事務(wù)無法正常結(jié)束
  • 系統(tǒng)可用性降低
  • 用戶體驗變差

(2) 超時處理機制

定時掃描超時事務(wù):

@Component
public class TccTimeoutChecker {
    
    @Autowired
    private TccLogRepository tccLogRepository;
    
    @Autowired
    private TccTransactionHandler transactionHandler;
    
    @Scheduled(fixedRate = 60000)  // 每分鐘執(zhí)行一次
    public void checkTimeout() {
        // 1. 查找超時的事務(wù)
        List<TccLog> timeoutLogs = tccLogRepository
            .findByPhaseAndCreateTimeBefore(
                "try", 
                LocalDateTime.now().minusMinutes(5)
            );
        
        for (TccLog log : timeoutLogs) {
            try {
                // 2. 執(zhí)行 Cancel 操作
                transactionHandler.cancelTransaction(log.getXid());
                
                // 3. 記錄取消日志
                log.setPhase("cancel");
                log.setUpdateTime(LocalDateTime.now());
                tccLogRepository.save(log);
                
            } catch (Exception e) {
                // 4. 記錄錯誤,可能需要人工介入
                errorLogger.log(
                    "Failed to cancel timeout transaction: " + log.getXid(),
                    e
                );
            }
        }
    }
}

超時配置管理:

@Configuration
public class TccConfig {
    
    @Value("${tcc.transaction.timeout:60000}")
    private long transactionTimeout;  // 默認(rèn)60秒
    
    @Value("${tcc.check.interval:5000}")
    private long checkInterval;       // 默認(rèn)5秒
    
    @Value("${tcc.retry.max:3}")
    private int maxRetryCount;        // 默認(rèn)重試3次
    
    @Value("${tcc.retry.interval:1000}")
    private long retryInterval;       // 默認(rèn)重試間隔1秒
    
    // getter and setter
}

監(jiān)控和告警:

@Component
public class TccMonitor {
    
    @Autowired
    private AlertService alertService;
    
    public void onTransactionTimeout(String xid) {
        // 記錄監(jiān)控指標(biāo)
        MetricsRegistry.counter("tcc.timeout").increment();
        
        // 發(fā)送告警
        alertService.sendAlert(
            "TCC Transaction Timeout",
            String.format("Transaction %s timeout", xid),
            AlertLevel.WARNING
        );
    }
    
    public void onCancelFailed(String xid, Exception e) {
        // 記錄監(jiān)控指標(biāo)
        MetricsRegistry.counter("tcc.cancel.failed").increment();
        
        // 發(fā)送告警
        alertService.sendAlert(
            "TCC Cancel Failed",
            String.format("Transaction %s cancel failed: %s", xid, e.getMessage()),
            AlertLevel.ERROR
        );
    }
}

(3) 最佳實踐

超時時間設(shè)置:

  • 根據(jù)業(yè)務(wù)特點設(shè)置合理的超時時間
  • 考慮網(wǎng)絡(luò)延遲和服務(wù)響應(yīng)時間
  • 為復(fù)雜業(yè)務(wù)預(yù)留足夠的處理時間
  • 不同類型的事務(wù)可以設(shè)置不同的超時時間

重試機制:

  • 實現(xiàn)指數(shù)退避算法
  • 設(shè)置最大重試次數(shù)
  • 合理的重試間隔
  • 重試時要考慮冪等性

監(jiān)控和告警:

  • 監(jiān)控超時事務(wù)數(shù)量
  • 監(jiān)控 Cancel 操作的成功率
  • 監(jiān)控資源占用情況
  • 設(shè)置合理的告警閾值

人工干預(yù):

  • 提供管理后臺
  • 支持手動觸發(fā) Cancel
  • 提供事務(wù)狀態(tài)查詢
  • 記錄詳細(xì)的操作日志

通過這些機制的組合,我們可以構(gòu)建一個健壯的 TCC 事務(wù)處理系統(tǒng),能夠:

  • 及時發(fā)現(xiàn)并處理超時事務(wù)
  • 防止資源被長期鎖定
  • 提供完善的監(jiān)控和運維能力
  • 在出現(xiàn)問題時及時告警并支持人工介入

四、最佳實踐

資源預(yù)留:

  • Try 階段要預(yù)留足夠的資源
  • 預(yù)留資源要考慮并發(fā)情況
  • 預(yù)留時間要合理設(shè)置

狀態(tài)機制:

  • 明確定義每個階段的狀態(tài)
  • 狀態(tài)轉(zhuǎn)換要有清晰的規(guī)則
  • 保存狀態(tài)轉(zhuǎn)換歷史

異常處理:

  • 所有異常都要有補償措施
  • 補償操作要能重試
  • 重試策略要合理設(shè)置

監(jiān)控告警:

  • 監(jiān)控每個階段的執(zhí)行情況
  • 設(shè)置合理的告警閾值
  • 提供人工干預(yù)的接口

五、適用場景

TCC 模式適合:

  • 強一致性要求高的業(yè)務(wù)
  • 實時性要求高的場景
  • 有資源鎖定需求的操作

不適合:

  • 業(yè)務(wù)邏輯簡單的場景
  • 對性能要求特別高的場景
  • 補償成本過高的業(yè)務(wù)

六、結(jié)論

TCC 是一種強大的分布式事務(wù)解決方案,它通過巧妙的補償機制來保證事務(wù)的一致性。雖然實現(xiàn)較為復(fù)雜,但在某些場景下是不可替代的選擇。

關(guān)鍵是要:

  • 理解業(yè)務(wù)場景
  • 合理設(shè)計補償邏輯
  • 做好異常處理
  • 重視監(jiān)控告警

通過合理使用 TCC 模式,我們可以在分布式系統(tǒng)中實現(xiàn)可靠的事務(wù)處理。

責(zé)任編輯:趙寧寧 來源: 架構(gòu)成長指南
相關(guān)推薦

2025-05-07 00:10:00

分布式事務(wù)TCC模式

2025-04-28 00:44:04

2025-04-29 04:00:00

分布式事務(wù)事務(wù)消息

2023-09-14 15:44:46

分布式事務(wù)數(shù)據(jù)存儲

2020-05-28 09:35:05

分布式事務(wù)方案

2025-04-30 10:44:02

2024-10-09 14:14:07

2021-06-28 10:03:44

分布式數(shù)據(jù)庫架構(gòu)

2022-01-12 10:02:02

TCC模式 Seata

2024-03-26 12:08:53

分布式事務(wù)存儲

2019-01-11 18:22:07

阿里巴巴技術(shù)開源

2010-07-21 13:53:41

SQL Server分

2024-06-28 09:07:19

2019-09-09 10:09:51

分布式事務(wù) 數(shù)據(jù)庫

2023-11-30 07:19:08

.NET開源

2024-06-13 08:04:23

2019-07-25 15:32:35

分布式事務(wù)微服務(wù)系統(tǒng)架構(gòu)

2025-08-27 09:11:48

2021-09-28 09:43:11

微服務(wù)架構(gòu)技術(shù)

2021-06-08 12:46:27

分布式阿里TCC
點贊
收藏

51CTO技術(shù)棧公眾號

精品999成人| 免费成人黄色| 午夜一区二区三区不卡视频| 亚洲精品久久久久久下一站 | 毛片aaaaa| 日韩精品一级| 亚洲网友自拍偷拍| 欧美二级三级| av中文在线观看| 国产一区二区高清| 欧美成人一区二区三区电影| 香蕉网在线播放| 精品国产乱码一区二区三区| 精品久久久久久久久久久| 在线综合视频网站| 日韩a在线观看| 国产一区二区不卡| 国产精品福利在线观看网址| 国产精品变态另类虐交| 97精品国产| 亚洲欧美日韩精品| 亚洲欧美福利视频| 亚洲精品一区二区三区av| 亚洲av无码一区二区乱子伦| 看片网站欧美日韩| 日本一欧美一欧美一亚洲视频| 黄色一级片在线| 色婷婷综合网| 亚洲视频一区二区| 男人的天堂影院| 国色天香久久精品国产一区| 欧美日韩视频在线第一区 | 亚洲女同在线| 欧美精品video| 国产极品国产极品| 热久久天天拍国产| 精品网站999www| 野战少妇38p| 精品国产三区在线| 欧美精品一级二级三级| 99久久激情视频| 99re6在线精品视频免费播放| 亚洲欧美色图小说| 亚洲精品国产精品久久| 国产最新视频在线观看| 91丝袜美腿高跟国产极品老师| 成人看片视频| 性欧美videos另类hd| 国产中文字幕一区| 91久久国产婷婷一区二区| 中国一区二区视频| 捆绑调教一区二区三区| 国产精品亚洲美女av网站| 999视频在线| 视频在线观看一区| 国产精品91久久久久久| 午夜视频网站在线观看| 日韩二区三区在线观看| 国产精品久久久久77777| 亚洲无码精品一区二区三区| 久久久久.com| 国产精品www网站| 91精品视频免费在线观看| 六月丁香婷婷久久| 成人精品久久av网站| 国产欧美日韩成人| 国产精品一二三四| 国产亚洲情侣一区二区无| 头脑特工队2免费完整版在线观看| 91视频免费看| 视频在线观看成人| 成人免费网址| 亚洲国产精品视频| 国产免费黄视频| 成人视屏在线观看| 3751色影院一区二区三区| 超碰人人cao| 牛牛精品成人免费视频| 国产香蕉一区二区三区在线视频| 人与嘼交av免费| 亚洲国产一成人久久精品| 久久6精品影院| 国产精品自拍99| 狠狠入ady亚洲精品经典电影| 欧美亚洲日本黄色| 黄色一区二区视频| 国产成人精品网址| 91天堂在线视频| 手机看片一区二区三区| 中文字幕国产精品一区二区| 国产91在线亚洲| 久色国产在线| 91福利在线观看| 欧美一级片在线免费观看| 亚洲精品3区| 久久综合电影一区| 国产精品视频免费播放| 久久99精品久久久久久国产越南 | 国产精品毛片高清在线完整版 | 亚洲国产国产亚洲一二三| 国产成人精彩在线视频九色| 97视频免费在线| 97久久久精品综合88久久| 中文字幕乱码一区二区三区| 麻豆免费在线| 日韩一区二区免费在线观看| 波多野结衣 在线| 国产综合激情| 成人日韩av在线| 手机亚洲第一页| 亚洲美女淫视频| 日本激情视频在线| 国产伦精品一区二区三区免费优势| 在线日韩精品视频| 香蕉免费毛片视频| 国产精品主播直播| 日韩中文一区二区三区| 大桥未久在线视频| 日韩一区二区三区电影在线观看| 免费福利视频网站| 国产亚洲综合精品| 国产日韩亚洲精品| 四虎影院观看视频在线观看| 欧美日韩一区二区欧美激情| 性少妇bbw张开| 99在线|亚洲一区二区| 99re在线观看| 国产美女在线观看| 欧美精品九九99久久| 第一次破处视频| 美女精品网站| 久久九九视频| 蜜桃视频在线观看播放| 亚洲白拍色综合图区| 国产精品视频一区二区三| 免费一级欧美片在线观看| 欧洲精品久久| 亚洲精品永久免费视频| 亚洲国产成人精品久久久国产成人一区 | 无码免费一区二区三区| 久久午夜羞羞影院免费观看| 91丨porny丨探花| 国产精品视屏| 亚州成人av在线| 欧美在线 | 亚洲| 亚洲成人资源在线| 日本一区二区在线免费观看| 影音先锋久久资源网| 成人资源av| 日本在线观看高清完整版| 日韩欧美成人激情| 欧美日韩精品亚洲精品| 国产综合色在线| 男女激烈动态图| 一区二区三区在线资源| 免费av一区二区| 亚洲乱码精品久久久久..| 一区二区三区蜜桃网| 久久久男人的天堂| 亚洲精品护士| 日本高清久久一区二区三区 | 91精品免费久久久久久久久| 在线视频婷婷| 欧美一区二区黄色| 国产精品suv一区二区| 91美女福利视频| 91九色在线观看视频| 亚州综合一区| 国产精品欧美风情| a级在线观看| 亚洲国产精品电影| 无码aⅴ精品一区二区三区| 国产精品夫妻自拍| 少妇搡bbbb搡bbb搡打电话| 国产午夜久久| 亚洲亚洲精品三区日韩精品在线视频 | 黄色免费在线播放| 欧美精品少妇一区二区三区| 精品欧美一区二区久久久久| 成人精品视频一区二区三区尤物| 成人一级片网站| 99久久久久| 国产自产精品| 国产精品伦一区二区| 美女av一区二区| 色播色播色播色播色播在线| 在线成人高清不卡| 日本熟妇色xxxxx日本免费看| 久久精品一区二区三区四区| 中文 日韩 欧美| 性色一区二区| 欧美 国产 精品| 欧美男gay| 国产99在线免费| 懂色aⅴ精品一区二区三区| 久久成人国产精品| 男人的天堂在线| 日韩一级黄色大片| 91黑人精品一区二区三区| 一区二区三区四区蜜桃| 日本性高潮视频| 国产98色在线|日韩| 日本成人在线免费视频| 国产一区二区三区四区老人| 日韩国产精品一区二区三区| 成人爽a毛片| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 国产人妻777人伦精品hd| 日韩欧美二区| 欧美中日韩免费视频| 日韩不卡在线视频| 国产欧美日韩91| 卡通欧美亚洲| 国产综合在线视频| 91国内在线| 中文字幕欧美亚洲| 秋霞av在线| 日韩女优av电影在线观看| 色婷婷久久综合中文久久蜜桃av| 亚洲国产精品一区二区久久| 亚洲熟女www一区二区三区| 亚洲国产精品精华液2区45| 久久久久9999| 成人国产精品视频| 丰满少妇一区二区三区专区| 日韩电影在线观看电影| 各处沟厕大尺度偷拍女厕嘘嘘| 欧美三区不卡| 男同互操gay射视频在线看| 日韩欧美精品| 一本久道久久综合狠狠爱亚洲精品| 亚洲va久久久噜噜噜久久| 国产伦精品一区二区三毛| 亚洲网一区二区三区| 91九色偷拍| 亚洲精品福利| 91九色在线免费视频| 日韩亚洲精品在线观看| 91九色单男在线观看| 99精品在线免费观看| 成人午夜两性视频| 深夜日韩欧美| 成人黄色片在线| 成人免费观看49www在线观看| 成人国产精品免费视频| 国产综合色激情| 91久久在线播放| 国产精品日本一区二区不卡视频 | 国产精品久久久久一区二区三区厕所 | 日韩片欧美片| 天堂v在线视频| 亚洲春色在线视频| 欧美区一区二区| 91九色国产视频| 秋霞午夜一区二区三区视频| 91影视免费在线观看| 日韩精品成人在线观看| eeuss一区二区三区| 色播一区二区| 国产精品永久入口久久久| heyzo高清中文字幕在线| 日本中文字幕不卡| 亚洲一级一级97网| 日韩三级电影免费观看| 中文字幕精品视频在线观看| 久久午夜影院| 久久久91精品国产一区二区三区| 自拍偷拍亚洲在线| 国产一区二区四区| 91黑人精品一区二区三区| 国产精品成人3p一区二区三区| 《视频一区视频二区| 91精品国自产在线| 日韩毛片高清在线播放| 少妇被躁爽到高潮无码文| 亚洲国产成人av网| 国产伦精品一区二区三区视频网站| 欧美伊人久久久久久久久影院| 中文字幕男人天堂| 欧美岛国在线观看| 欧美少妇另类| 久久成人av网站| 日本免费一区二区六区| 国产日韩视频在线观看| **爰片久久毛片| 日韩一区二区三区资源| 欧美在线不卡| 任你操这里只有精品| 精品中文字幕一区二区| 老司机午夜免费福利| 国产精品乱码人人做人人爱| 久久久久黄色片| 欧美在线视频你懂得| 理论片中文字幕| 中国人与牲禽动交精品| 黄色羞羞视频在线观看| 国产精品国产三级国产aⅴ9色| 日本一区二区三区视频在线看 | 日韩精品一区二区三区色欲av| 久久精品国产一区二区| 北岛玲一区二区| 亚洲美女在线一区| 成人小视频在线播放| 欧美成人精精品一区二区频| www.av在线播放| 88xx成人精品| 亚洲综合色婷婷在线观看| 日韩欧美第二区在线观看| 在线播放一区| xxxx在线免费观看| 久久久精品蜜桃| 日韩av一二三区| 日韩你懂的在线播放| 日本最黄一级片免费在线| 69久久夜色精品国产7777 | 精品国产乱码久久久久| 91精品国产自产在线观看永久∴ | 亚洲男女自偷自拍图片另类| 日本三级在线观看网站| 国产自摸综合网| 色综合久久网| 91av俱乐部| 91麻豆福利精品推荐| 久久久精品视频在线| 在线成人午夜影院| av电影在线观看| 日韩av电影院| 亚洲ab电影| 久久久999视频| 99在线精品视频| 国产精品50页| 亚洲国产精品视频在线观看| 美女尤物在线视频| 91国产丝袜在线放| 欧美人成网站| 国产精品99精品无码视亚| 亚洲免费资源在线播放| 国产精品天天操| 美女久久久久久久| 久久视频社区| 日本一道在线观看| 国产91丝袜在线观看| 久久久久成人精品无码| 亚洲第一福利网| 都市激情国产精品| 老牛影视免费一区二区| 久久国产精品99国产| 中文字幕一区二区三区人妻电影| 一本到不卡免费一区二区| 久蕉依人在线视频| 国产精品免费观看在线| 欧美r级电影| 亚洲成人手机在线观看| 一区二区三区国产豹纹内裤在线| 亚洲国产成人精品一区二区三区| 欧美国产乱视频| 久久夜色电影| 国产成人久久婷婷精品流白浆| 久久精品一区二区| 91黄色在线视频| 欧美激情视频三区| 性人久久久久| 簧片在线免费看| 国产精品国产三级国产有无不卡 | 7777在线视频| 成人免费福利片| 国产精品自拍99| 中文字幕亚洲在线| 日韩精品成人在线观看| 鲁一鲁一鲁一鲁一澡| 国产日韩欧美精品电影三级在线| 国产在线一级片| 欧美另类在线播放| 欧美午夜寂寞| 天堂中文av在线| 午夜精品久久久久久久99樱桃 | 久久成人免费视频| 精品精品国产毛片在线看| 久久精品网站视频| 亚洲日本丝袜连裤袜办公室| 色噜噜一区二区三区| 国产精品专区第二| 激情偷拍久久| 中国1级黄色片| 亚洲国产日韩欧美在线99| 国模一区二区| 欧美大黑帍在线播放| 国产欧美日韩麻豆91| 国产综合无码一区二区色蜜蜜| 国产不卡在线观看| 欧美激情五月| 51妺嘿嘿午夜福利| 精品久久久久久综合日本欧美| 成人开心激情| 无罩大乳的熟妇正在播放| 国产精品国产精品国产专区不蜜| 人妻精品无码一区二区| 国产综合久久久久| 天堂久久久久va久久久久| 免费一级片在线观看|