国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Seata TCC分布式事務(wù)實戰(zhàn):從原理到生產(chǎn)環(huán)境避坑指南

Seata TCC分布式事務(wù)實戰(zhàn):從原理到生產(chǎn)環(huán)境避坑指南 1. 從“分布式事務(wù)”這個老難題說起如果你做過幾年后端開發(fā)尤其是在微服務(wù)架構(gòu)下折騰過數(shù)據(jù)一致性那“分布式事務(wù)”這個詞對你來說大概率不是什么美好的回憶。訂單創(chuàng)建了庫存沒扣積分增加了優(yōu)惠券沒核銷這種“一半成功一半失敗”的爛攤子處理起來比寫業(yè)務(wù)代碼本身還頭疼。我最早接觸分布式事務(wù)解決方案時試過基于消息隊列的最終一致性也折騰過兩階段提交2PC各有各的麻煩。消息隊列方案對業(yè)務(wù)侵入大補償邏輯復(fù)雜而傳統(tǒng)的2PC對數(shù)據(jù)庫和中間件要求高性能瓶頸明顯在云原生和微服務(wù)拆得越來越細的今天顯得有點力不從心。正是在這種背景下像Seata這樣的分布式事務(wù)框架開始流行起來。它把那些復(fù)雜的協(xié)調(diào)、回滾邏輯封裝起來給我們提供了一套相對統(tǒng)一的編程模型。Seata支持好幾種模式比如AT自動補償、TCCTry-Confirm-Cancel、Saga長事務(wù)等。今天我們不聊別的就聚焦在TCC模式上。為什么是TCC因為在我看來它是業(yè)務(wù)侵入性、性能和數(shù)據(jù)強一致性之間一個非常不錯的平衡點。它不像AT模式那樣嚴(yán)重依賴數(shù)據(jù)庫的undo log對某些不支持undo log的數(shù)據(jù)庫或中間件不友好也不像Saga模式那樣一階段就提交可能產(chǎn)生臟讀。TCC要求我們開發(fā)者自己定義三個明確的階段Try、Confirm、Cancel雖然多寫了一些代碼但換來了對事務(wù)邊界的絕對掌控和對各種異構(gòu)數(shù)據(jù)源比如Redis、ES、MQ的支持能力。網(wǎng)上關(guān)于Seata TCC的教程不少但很多要么是官網(wǎng)示例的簡單復(fù)刻要么只講通了Demo一遇到生產(chǎn)環(huán)境的復(fù)雜場景——比如嵌套調(diào)用、并發(fā)沖突、空回滾、冪等控制——就語焉不詳。這篇文章我就結(jié)合自己最近在一個電商履約系統(tǒng)中落地Seata TCC 1.4.2的真實經(jīng)歷把從環(huán)境搭建、代碼編寫、到各種坑的排查和填平過程給你完整地捋一遍。我們的目標(biāo)是讓你看完之后不僅能跑通一個TCC示例更能理解其內(nèi)在機制具備在實際項目中設(shè)計和駕馭TCC事務(wù)的能力。2. 環(huán)境與項目骨架避開第一個坑在開始寫一行業(yè)務(wù)代碼之前先把環(huán)境搭對能省掉后面80%的莫名其妙的問題。我這次用的是Seata 1.4.2版本部署方式選擇了Docker Compose這比直接下載jar包運行要方便和干凈得多。2.1 部署Seata Server (TC)TC是Transaction Coordinator事務(wù)協(xié)調(diào)器是Seata的大腦必須最先啟動。很多人卡在第一步就是因為沒搞清楚配置。首先你需要一個docker-compose.yml文件。網(wǎng)上很多教程給的配置還是老版本的直接抄過來可能連服務(wù)都起不來。下面是我驗證過可用的1.4.2版本配置version: 3.8 services: seata-server: image: seataio/seata-server:1.4.2 container_name: seata-server ports: - 8091:8091 # 事務(wù)協(xié)調(diào)器默認(rèn)端口 - 7091:7091 # 控制臺端口1.4.2開始自帶控制臺 environment: - SEATA_IP你的服務(wù)器IP # 重要如果是云服務(wù)器填內(nèi)網(wǎng)IP本地測試填127.0.0.1 - SEATA_PORT8091 - STORE_MODEfile # 事務(wù)日志存儲模式單機測試用file最簡單。生產(chǎn)環(huán)境請用db或redis - SERVER_NODE1 # 節(jié)點編號單機就是1 volumes: - ./seata-config:/seata-server/resources networks: - seata-net networks: seata-net: driver: bridge這里有幾個關(guān)鍵點SEATA_IP這是最大的坑。這個IP是TC服務(wù)對外暴露的地址Client你的業(yè)務(wù)服務(wù)要靠這個地址來連接TC。如果你在本地用Docker跑Client是宿主機上的Spring Boot應(yīng)用那么這里應(yīng)該填宿主機的IP127.0.0.1或本機局域網(wǎng)IP而不是容器內(nèi)部的IP。如果填錯了Client會連不上TC報“no available server to connect”錯誤。存儲模式STORE_MODEfile表示將事務(wù)日志全局事務(wù)會話、分支事務(wù)記錄等存在本地文件。這對于開發(fā)測試完全沒問題重啟容器數(shù)據(jù)就沒了。生產(chǎn)環(huán)境絕對不要用file模式因為無法支持集群和高可用。生產(chǎn)環(huán)境應(yīng)該用db模式并配置好對應(yīng)的數(shù)據(jù)庫連接信息。控制臺從1.4.2開始Seata Server自帶了一個簡單的控制臺訪問http://你的IP:7091即可默認(rèn)賬號密碼是seata/seata??梢栽谏厦娌榭慈质聞?wù)列表和狀態(tài)對于調(diào)試非常有用。啟動命令很簡單docker-compose up -d。用docker logs -f seata-server查看日志看到 “Server started...” 的字樣就說明啟動成功了。2.2 準(zhǔn)備業(yè)務(wù)項目TM/RMTC搭好了接下來是事務(wù)參與者也就是我們的業(yè)務(wù)服務(wù)。我們需要創(chuàng)建一個簡單的多模塊Spring Boot項目來模擬分布式場景。假設(shè)我們有一個“訂單服務(wù)”和一個“庫存服務(wù)”。項目依賴是關(guān)鍵。在父pom中引入Spring Cloud和Spring Cloud Alibaba的依賴管理。注意版本兼容性我用的組合是Spring Boot: 2.3.12.RELEASESpring Cloud: Hoxton.SR12Spring Cloud Alibaba: 2.2.7.RELEASE在訂單服務(wù)和庫存服務(wù)的pom中都需要引入以下核心依賴!-- Seata 客戶端 -- dependency groupIdio.seata/groupId artifactIdseata-spring-boot-starter/artifactId version1.4.2/version /dependency !-- Spring Cloud Alibaba Nacos 作為配置和注冊中心也可用Eureka等 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency配置文件application.yml是另一個容易出錯的地方。訂單服務(wù)作為事務(wù)發(fā)起者TM的配置示例spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 # Nacos地址 config: server-addr: localhost:8848 file-extension: yaml seata: application-id: ${spring.application.name} tx-service-group: my_test_tx_group # 事務(wù)組需要和TC配置對應(yīng) enable-auto-data-source-proxy: false # TCC模式不需要數(shù)據(jù)源代理設(shè)為false config: type: nacos # 從Nacos讀取TC配置 nacos: server-addr: ${spring.cloud.nacos.config.server-addr} group: SEATA_GROUP >dependency groupIdio.seata/groupId artifactIdseata-rm-tcc/artifactId version1.4.2/version /dependency然后定義接口。這個接口必須被業(yè)務(wù)實現(xiàn)類實現(xiàn)并且方法要遵循特定規(guī)則LocalTCC // 聲明這是一個本地TCC接口 public interface InventoryTccAction { /** * Try 方法 * param businessKey 業(yè)務(wù)唯一鍵用于標(biāo)識本次操作 * param productId 商品ID * param count 扣減數(shù)量 * return 是否成功 */ TwoPhaseBusinessAction(name inventoryTccAction, commitMethod commit, rollbackMethod cancel) boolean prepare(BusinessActionContext actionContext, BusinessActionContextParameter(paramName productId) String productId, BusinessActionContextParameter(paramName count) Integer count); /** * Confirm 方法 * param actionContext 業(yè)務(wù)上下文框架自動注入包含prepare方法的參數(shù) * return 是否成功 */ boolean commit(BusinessActionContext actionContext); /** * Cancel 方法 * param actionContext 業(yè)務(wù)上下文 * return 是否成功 */ boolean cancel(BusinessActionContext actionContext); }關(guān)鍵注解解析LocalTCC: 標(biāo)識這是一個TCC接口可以是Spring Bean。TwoPhaseBusinessAction: 核心注解標(biāo)注在Try方法上。name: TCC事務(wù)的名稱全局唯一用于標(biāo)識這個業(yè)務(wù)動作。commitMethod: Confirm方法的方法名。rollbackMethod: Cancel方法的方法名。BusinessActionContextParameter: 標(biāo)注在Try方法的參數(shù)上框架會將這些參數(shù)值保存到BusinessActionContext中并自動傳遞給后續(xù)的Confirm/Cancel方法。這是TCC模式能正確回滾的關(guān)鍵因為Cancel方法需要知道Try階段凍結(jié)的是哪個商品、多少數(shù)量。3.2 實現(xiàn)TCC接口接下來是實現(xiàn)類。這里的設(shè)計直接關(guān)系到事務(wù)的可靠性。Service public class InventoryTccActionImpl implements InventoryTccAction { Autowired private InventoryMapper inventoryMapper; Override Transactional(rollbackFor Exception.class) public boolean prepare(BusinessActionContext actionContext, String productId, Integer count) { // 1. 檢查庫存是否充足 Inventory inventory inventoryMapper.selectById(productId); if (inventory null || inventory.getAvailable() count) { throw new RuntimeException(庫存不足); } // 2. 執(zhí)行預(yù)留操作凍結(jié)庫存 int frozen inventory.getFrozen() null ? 0 : inventory.getFrozen(); int newFrozen frozen count; int newAvailable inventory.getAvailable() - count; int updateCount inventoryMapper.updateFrozenAndAvailable(productId, newFrozen, newAvailable); if (updateCount ! 1) { throw new RuntimeException(凍結(jié)庫存失敗可能并發(fā)沖突); } // 3. 記錄預(yù)留日志可選但推薦用于冪等和排查 // 可以將 xid, branchId, productId, count, status(try) 插入一張單獨的日志表 log.info(TCC Try 成功。xid{}, productId{}, count{}, actionContext.getXid(), productId, count); return true; } Override Transactional(rollbackFor Exception.class) public boolean commit(BusinessActionContext actionContext) { String xid actionContext.getXid(); String productId (String) actionContext.getActionContext(productId); Integer count (Integer) actionContext.getActionContext(count); log.info(TCC Confirm 開始。xid{}, productId{}, count{}, xid, productId, count); // 1. 冪等性檢查查詢?nèi)罩颈砣绻搙id和branchId已經(jīng)執(zhí)行過confirm則直接返回true // if (tccLogService.isConfirmed(xid, branchId)) { return true; } // 2. 執(zhí)行真正的扣減將凍結(jié)的庫存清零總庫存減少 int updateCount inventoryMapper.confirmDeduct(productId, count); if (updateCount ! 1) { // 這里可能因為Try階段數(shù)據(jù)被篡改等原因失敗需要告警和人工介入 log.error(TCC Confirm 失敗xid{}, xid); // 通常Confirm不允許失敗失敗后應(yīng)不斷重試直到成功??蚣軙卦?。 throw new RuntimeException(Confirm扣減庫存失敗); } // 3. 更新日志表狀態(tài)為 commit // tccLogService.updateStatus(xid, branchId, commit); log.info(TCC Confirm 成功。xid{}, xid); return true; } Override Transactional(rollbackFor Exception.class) public boolean cancel(BusinessActionContext actionContext) { String xid actionContext.getXid(); String productId (String) actionContext.getActionContext(productId); Integer count (Integer) actionContext.getActionContext(count); log.info(TCC Cancel 開始。xid{}, productId{}, count{}, xid, productId, count); // 1. 冪等性檢查查詢?nèi)罩颈砣绻搙id和branchId已經(jīng)執(zhí)行過cancel則直接返回true // if (tccLogService.isCancelled(xid, branchId)) { return true; } // 2. 執(zhí)行取消操作釋放凍結(jié)的庫存 int updateCount inventoryMapper.cancelDeduct(productId, count); if (updateCount ! 1) { // Cancel失敗也需要重試。但這里有個“空回滾”問題需要處理見下文。 log.error(TCC Cancel 失敗xid{}, xid); throw new RuntimeException(Cancel釋放庫存失敗); } // 3. 更新日志表狀態(tài)為 cancel // tccLogService.updateStatus(xid, branchId, cancel); log.info(TCC Cancel 成功。xid{}, xid); return true; } }實現(xiàn)要點與坑點數(shù)據(jù)庫操作Try階段是凍結(jié)Confirm是扣減凍結(jié)值Cancel是釋放凍結(jié)值。這三個操作必須是冪等的。這意味著即使網(wǎng)絡(luò)超時導(dǎo)致TC重復(fù)調(diào)用執(zhí)行多次也不會對數(shù)據(jù)狀態(tài)產(chǎn)生錯誤影響。上面的代碼通過“冪等性檢查”和“基于狀態(tài)的更新”如update table set frozen frozen - #{count} where product_id #{id} and frozen #{count}來保證。業(yè)務(wù)上下文BusinessActionContext是框架在Try階段幫你保存的參數(shù)包在Confirm/Cancel階段自動注入。務(wù)必用BusinessActionContextParameter注解標(biāo)記所有Cancel階段需要的參數(shù)。本地事務(wù)每個TCC方法prepare, commit, cancel都標(biāo)注了Transactional。這是因為每個階段本身可能包含多個數(shù)據(jù)庫操作需要保證其原子性。Seata的全局事務(wù)是由這些本地事務(wù)組合而成的。日志表強烈建議建立一張獨立的TCC事務(wù)日志表。記錄xid全局事務(wù)ID、branchId分支事務(wù)ID、業(yè)務(wù)鍵、狀態(tài)try/commit/cancel、創(chuàng)建時間。它的作用巨大冪等控制在Confirm/Cancel前先查日志避免重復(fù)執(zhí)行。問題排查當(dāng)出現(xiàn)異常時可以通過日志還原事務(wù)執(zhí)行鏈路。防懸掛配合“空回滾”檢查。4. 發(fā)起與管控全局事務(wù)TM的角色庫存服務(wù)的TCC接口準(zhǔn)備好了現(xiàn)在需要在訂單服務(wù)事務(wù)管理器TM中發(fā)起并管理這個全局事務(wù)。在訂單服務(wù)的業(yè)務(wù)方法上使用GlobalTransactional注解即可開啟一個Seata全局事務(wù)。Service public class OrderServiceImpl implements OrderService { Autowired private InventoryTccAction inventoryTccAction; // 通過Feign或Dubbo引入的遠程TCC接口代理 Autowired private OrderMapper orderMapper; Override GlobalTransactional(name createOrder, timeoutMills 60000, rollbackFor Exception.class) public Order createOrder(OrderDTO orderDTO) { // 1. 創(chuàng)建訂單本地事務(wù) Order order new Order(); // ... 設(shè)置訂單屬性 orderMapper.insert(order); // 2. 調(diào)用庫存服務(wù)執(zhí)行TCC Try階段 BusinessActionContext context new BusinessActionContext(); context.setActionName(inventoryTccAction); // 這里實際是通過RPC框架如Feign調(diào)用了 inventoryTccAction.prepare(context, ...) boolean tryResult inventoryTccAction.prepare(context, orderDTO.getProductId(), orderDTO.getCount()); if (!tryResult) { throw new RuntimeException(庫存預(yù)留失敗); } // 注意Try階段只是預(yù)留資源訂單創(chuàng)建和庫存預(yù)留都未最終提交。 // 3. 這里可以繼續(xù)調(diào)用其他TCC服務(wù)比如扣減積分、優(yōu)惠券... // 如果所有Try都成功GlobalTransactional 注解的方法正常結(jié)束Seata會自動觸發(fā)所有參與者的Confirm階段。 // 如果此處拋出異常Seata會自動觸發(fā)所有參與者的Cancel階段。 return order; } }TM端的關(guān)鍵點GlobalTransactional這是TM的標(biāo)識。它會在方法開始時向TC申請一個全局事務(wù)IDXID并將其通過線程上下文傳播到所有遠程調(diào)用中。超時控制timeoutMills很重要。它定義了整個全局事務(wù)的超時時間。如果超過這個時間事務(wù)還未完成所有分支未到達終態(tài)TC會主動發(fā)起回滾。需要根據(jù)業(yè)務(wù)鏈路的復(fù)雜度合理設(shè)置。異?;貪L默認(rèn)情況下只有RuntimeException和Error會觸發(fā)回滾。如果你希望受檢異常也回滾需要使用rollbackFor屬性指定。RPC調(diào)用調(diào)用inventoryTccAction.prepare看起來是本地調(diào)用但實際上它應(yīng)該是一個遠程服務(wù)的代理。你需要通過Feign或Dubbo將InventoryTccAction接口暴露為遠程服務(wù)并在訂單服務(wù)中通過FeignClient等方式引入。Seata的TCC組件會自動攔截這個調(diào)用將其注冊為一個分支事務(wù)到TC。5. 生產(chǎn)環(huán)境避坑指南空回滾、冪等與懸掛如果只是跑通Demo上面的知識就夠了。但一旦上生產(chǎn)你會遇到幾個經(jīng)典的“坑”。不處理好它們分布式事務(wù)的可靠性無從談起。5.1 空回滾Empty Rollback問題描述一個分支事務(wù)的Try方法因網(wǎng)絡(luò)超時等原因根本沒有執(zhí)行但TM卻發(fā)起了全局回滾導(dǎo)致TC調(diào)用了該分支的Cancel方法。后果Cancel方法執(zhí)行了“釋放凍結(jié)資源”的操作但Try根本沒凍結(jié)過任何資源。這可能導(dǎo)致數(shù)據(jù)不一致比如庫存被錯誤地增加了。解決方案在Cancel方法中必須進行空回滾判斷。Override public boolean cancel(BusinessActionContext actionContext) { String xid actionContext.getXid(); Long branchId actionContext.getBranchId(); // 1. 查詢事務(wù)日志表判斷Try是否執(zhí)行過 TccLog tccLog tccLogService.getByXidAndBranchId(xid, branchId); if (tccLog null) { // Try沒執(zhí)行過是空回滾 log.warn(收到空回滾請求xid{}, branchId{}. 插入一條取消記錄防止懸掛。, xid, branchId); // 插入一條狀態(tài)為‘cancel’的記錄目的是為了“占位”防止后續(xù)的懸掛問題 tccLogService.insertCancelLog(xid, branchId, productId, count); return true; // 空回滾直接返回成功 } // 2. 如果已經(jīng)執(zhí)行過Cancel冪等返回 if (cancel.equals(tccLog.getStatus())) { return true; } // 3. 正常執(zhí)行Cancel邏輯... }核心就是Cancel時檢查Try是否已執(zhí)行。沒執(zhí)行過就是空回滾記錄一條Cancel日志后直接返回不執(zhí)行業(yè)務(wù)邏輯。5.2 冪等控制Idempotence問題描述由于網(wǎng)絡(luò)抖動或TC重試機制Confirm或Cancel接口可能會被重復(fù)調(diào)用。后果如果不做冪等重復(fù)的Confirm會導(dǎo)致資源被多次扣減重復(fù)的Cancel會導(dǎo)致資源被多次釋放。解決方案利用事務(wù)日志表實現(xiàn)冪等。在Try成功后插入一條狀態(tài)為try的記錄。在Confirm/Cancel執(zhí)行前先查日志。如果狀態(tài)已經(jīng)是commit/cancel則直接返回成功。執(zhí)行完Confirm/Cancel業(yè)務(wù)邏輯后更新日志狀態(tài)為commit/cancel。所有數(shù)據(jù)庫更新操作盡量使用帶狀態(tài)的更新語句例如-- Confirm: 扣減凍結(jié)值同時確保凍結(jié)值足夠 UPDATE inventory SET frozen frozen - #{count}, total total - #{count} WHERE product_id #{productId} AND frozen #{count}; -- Cancel: 釋放凍結(jié)值同時確保凍結(jié)值足夠 UPDATE inventory SET frozen frozen - #{count}, available available #{count} WHERE product_id #{productId} AND frozen #{count};這樣即使重復(fù)執(zhí)行只要條件不滿足影響行數(shù)就是0不會破壞數(shù)據(jù)。5.3 懸掛Hanging問題描述空回滾發(fā)生后之前被阻塞的Try請求終于到達了服務(wù)端并執(zhí)行成功。后果Try在Cancel之后執(zhí)行導(dǎo)致資源被凍結(jié)但再也沒有Confirm或Cancel來釋放它了因為全局事務(wù)已結(jié)束造成資源永久鎖定。解決方案在Try方法中進行懸掛判斷。Override public boolean prepare(BusinessActionContext actionContext, String productId, Integer count) { String xid actionContext.getXid(); Long branchId actionContext.getBranchId(); // 懸掛檢查在執(zhí)行業(yè)務(wù)前先查日志 TccLog tccLog tccLogService.getByXidAndBranchId(xid, branchId); if (tccLog ! null cancel.equals(tccLog.getStatus())) { // 發(fā)現(xiàn)已經(jīng)有一條Cancel日志說明發(fā)生了空回滾且Cancel先于Try到達 log.warn(檢測到懸掛Try方法被拒絕執(zhí)行。xid{}, branchId{}, xid, branchId); return true; // 或者拋出一個特定的異常讓TM感知 } // ... 正常的Try業(yè)務(wù)邏輯 // 執(zhí)行業(yè)務(wù)后插入狀態(tài)為‘try’的日志 tccLogService.insertTryLog(xid, branchId, productId, count); return true; }核心是Try執(zhí)行前檢查是否已有對應(yīng)xid和branchId的Cancel記錄。如果有說明是懸掛應(yīng)拒絕執(zhí)行Try業(yè)務(wù)邏輯??栈貪L、冪等、懸掛這三個問題是TCC模式在生產(chǎn)環(huán)境落地必須解決的“三座大山”。解決它們的核心工具就是那張TCC事務(wù)日志表。通過它記錄狀態(tài)所有操作都變成“先查后改”的模式從而保證最終一致性。6. 進階話題嵌套調(diào)用、并發(fā)與監(jiān)控解決了基本可靠性問題我們再看一些更復(fù)雜的場景。6.1 嵌套的TCC調(diào)用有時候一個TCC服務(wù)內(nèi)部需要調(diào)用另一個TCC服務(wù)。比如“創(chuàng)建訂單”事務(wù)中調(diào)用“庫存服務(wù)”的TCC接口而“庫存服務(wù)”的Try操作里又需要調(diào)用“倉儲服務(wù)”的TCC接口來鎖定庫位。Seata是支持這種嵌套的。關(guān)鍵在于XID的傳遞。只要確保RPC框架如Dubbo、Feign的過濾器正確地將當(dāng)前線程上下文中的XID傳遞到下游服務(wù)Seata就能自動識別并管理這個嵌套分支事務(wù)。它會形成一個調(diào)用樹TC會確保所有分支包括嵌套的一起提交或回滾。在代碼上不需要特殊處理只需確保每個服務(wù)都正確引入了Seata客戶端并配置了事務(wù)組。6.2 高并發(fā)下的資源競爭在TCC的Try階段我們經(jīng)常要“凍結(jié)”資源。在高并發(fā)場景下對同一條記錄比如同一商品庫存的凍結(jié)操作可能發(fā)生沖突。解決方案數(shù)據(jù)庫悲觀鎖在Try方法的SQL中使用SELECT ... FOR UPDATE先鎖定記錄再執(zhí)行更新。但這會嚴(yán)重影響性能。樂觀鎖在庫存表中增加一個版本號字段。Try操作時使用UPDATE ... SET frozen frozen #{count}, version version 1 WHERE id #{id} AND version #{oldVersion}。如果更新失敗影響行數(shù)為0說明發(fā)生了并發(fā)沖突可以重試或直接返回失敗。分布式鎖在進入Try業(yè)務(wù)邏輯前用Redis或Zookeeper對業(yè)務(wù)鍵如lock:inventory:{productId}加鎖。這是最常用的方式但要注意鎖的粒度、超時時間和釋放的可靠性。我個人更傾向于“樂觀鎖 有限重試”或“細粒度分布式鎖”的組合。在庫存凍結(jié)場景可以在應(yīng)用層用Redis分布式鎖控制同一商品ID的并發(fā)然后在數(shù)據(jù)庫層用樂觀鎖做最終保障。6.3 監(jiān)控與排查當(dāng)TCC事務(wù)出現(xiàn)問題時排查鏈路比普通調(diào)用復(fù)雜。你需要關(guān)注幾個點Seata TC控制臺訪問http://tc-server:7091查看全局事務(wù)列表。你可以看到每個全局事務(wù)的XID、狀態(tài)、開始時間、耗時以及其下所有分支事務(wù)的狀態(tài)。這是最直觀的定位工具。業(yè)務(wù)日志在TCC接口的三個方法中務(wù)必打印包含XID和BranchId的日志。這是串聯(lián)整個事務(wù)鏈路的唯一標(biāo)識。通過ELK或類似的日志聚合系統(tǒng)用XID可以輕松搜出該事務(wù)在所有微服務(wù)中的執(zhí)行痕跡。事務(wù)日志表你業(yè)務(wù)庫里的那張TCC日志表是最終的證據(jù)。通過它可以清楚地看到每個分支事務(wù)走到了哪一步try/commit/cancel以及執(zhí)行時間。如果發(fā)現(xiàn)一個事務(wù)長時間處于“try”狀態(tài)那很可能發(fā)生了懸掛如果大量“cancel”日志沒有對應(yīng)的“try”日志那可能是空回滾頻發(fā)需要檢查網(wǎng)絡(luò)或超時配置。Metrics監(jiān)控Seata客戶端會暴露一些Metrics需要額外配置比如全局事務(wù)提交/回滾次數(shù)、分支事務(wù)注冊次數(shù)、各種模式的耗時等??梢越尤隤rometheus和Grafana對分布式事務(wù)的健康度進行監(jiān)控和告警。7. 總結(jié)與個人體會走完這一整套流程從環(huán)境搭建、代碼編寫到填坑進階你應(yīng)該對Seata TCC模式有了比較立體的認(rèn)識。它不是銀彈需要你付出額外的設(shè)計設(shè)計TCC接口和資源預(yù)留邏輯和編碼實現(xiàn)三階段方法成本。但換來的是對復(fù)雜業(yè)務(wù)場景更強的掌控力以及對異構(gòu)數(shù)據(jù)源的支持。我個人在項目中的體會是設(shè)計階段多花時間在寫代碼前一定要和業(yè)務(wù)方、架構(gòu)師一起把每個分布式事務(wù)的邊界、每個參與服務(wù)的Try/Confirm/Cancel具體操作畫清楚。特別是資源預(yù)留的粒度是鎖整條記錄還是鎖部分字段這直接影響并發(fā)性能。日志表是生命線那張小小的TCC事務(wù)日志表在開發(fā)和排查階段的價值遠超你的想象。一定要建而且要設(shè)計好查詢索引xid, branch_id, status, create_time。超時時間要合理全局事務(wù)超時時間timeoutMills不能設(shè)得太短否則長鏈路業(yè)務(wù)容易超時回滾也不能設(shè)得太長否則出問題時資源鎖定時間過長。需要根據(jù)壓測和線上監(jiān)控來調(diào)整。做好降級和熔斷分布式事務(wù)框架本身也可能成為故障點。如果TC集群不可用你的業(yè)務(wù)應(yīng)該有降級方案比如切到基于消息的最終一致性或者記錄異常工單人工處理。在調(diào)用TCC服務(wù)時也要配置好Feign/Dubbo的超時和熔斷避免一個分支事務(wù)的阻塞拖垮整個全局事務(wù)。最后TCC模式的思想——先試探后確認(rèn)——其實是一種非常普適的解決分布式問題的思路。即使未來你不使用Seata這種通過業(yè)務(wù)日志和狀態(tài)機來實現(xiàn)最終一致性的模式在設(shè)計和處理復(fù)雜業(yè)務(wù)邏輯時依然會給你帶來啟發(fā)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
999精品国产高清一区二区| 91AV天美在线视频| 91男人天堂网| 韩日色费| 乱理日韩中文| 第四色奇米影视777| 啊a一区在线| 精品人妻少妇| 日韩熟妇二区| 国产欧美另类久久久精品课程| av网站免费线看| 熟妇最新先锋一二三区| 国产亚洲日韩在线三区黑人| 亚洲色图 图片| 成 人片 黄色大片| 综合天天网| 日本操逼aaaaa| 手机不卡视频不卡在线一二三区| 久操网无码在线| 一区二区亚州激情久婷婷欧美| 国产精品美女在线一区| 伊人国产AV| 99热在线观看| 午夜福利视频在线一区| 911av网站免费观看| 久草精品国产蜜臀| 手机看片1025| 午夜精品久久一区二区| 亚洲资源网| 在线人人人人人人精品超| 日产成人久久| 欧美亚洲厕所精品偷拍91| 日韩国产中文字幕| 变态乱伦伪娘灌肠一区二区| 欧美综色欧| 亚洲欧美天堂在线| 大香蕉97久久| 欧美黄色片AAAAA| 亚洲精品国产日韩无码AV永久免 | 黄页| 亚洲AV无码久久精品蜜桃小说| 亚洲最新av无码成人精品区| 亚洲av综合伊人久久| 女同性恋中文字幕| 高精欧美色| 偷拍2020| 青青草日本中文字幕| 无码人妻一区二区一牛影视| 2020中文字幕| 91啪啪| 国产久久av| 日韩字幕一区| 五月天婷婷欧美三区| av绯色| a片久久久久久久久久久久| 99AV| 日本精品五区| 美日韩男女操屄视频| 亚洲国产精品久久AV| 超碰色图| 强奸抽插av| A 天堂| 日韩精品免费高清视频在线| 在线观看中文av字幕| 欧美性爱18观看| 久久久久久亚洲中文| 国产精品九九九| 伊人五月天婷婷| 无码久久国产| 麻豆这里只有精品| 亚洲春色激情小说| 老鸭窝日丰县女人| 狠日欧美| 日本精品无码三级网站| 五月天激情国产综合婷婷婷| 欧美狠狠操| 午夜精品久久999热蜜桃介男人用| 96免费视频在线| 久9爱经典视频| 久9爱精品| 大香蕉AV在线| 97超级欧美| 亚洲欧美国产精品久久久久久久| 亚洲激情综合另类男同| 99爱视频| 天天干夜夜鈤| 免费黄色视频网址| 日本最新免费韩国1区2区视频播放| 少妇丝袜在线观看AV| 看日韩黄片| 日本午夜福利影院| 1024午夜激情男人的天堂| 欧美日韩色综合网| 精品人妻一区二区三区夜夜| 亚洲啪AⅤ永久无码| 精品.99999| 久欲AV| 夜间福利片1000无码| 精品网站99999| 制度丝袜99| 台湾佬中文娱乐自偷自拍| 大香蕉中文在线| 欧美成熟性爱精品| 久久精品一区二区一8| 免费看一级a性色生活片久久无| 91麻豆一二三区| 色色香蕉| 9丨久久九九九| 免费精品福利在线观看| 殴美色网| 综合久草| 国产精品日韩在线一区| 国产第二页| 日韩伦理久 久久 清纯| 97干色| 国产超碰国产97| 久久久久久久久久9| 天天狠| 久久精品国产亚洲AV清纯| 亚洲一区二区麻豆影院| 欧美传媒| 欧美高清在线| 精品二区三四区五电影 | 天天操人人操骚逼网站| 亚洲国产欧美中文永久| 黑人猛交| 中文字幕1区2区| 精品一区二区三区四区女| 立川理惠无码一区二区| www.91人妻.com| 亚洲综合情色| 欧美综合天堂| 91九色网| 亚洲18禁| 亚洲人在线| 国产成年女人免费视频播放a| 欧美天天综| 日韩探花精品在线视频| 人妻精品视频一区二区三区| 97超碰磁| 久久香蕉国产线看观看亚洲女人| 一区二区三区日韩欧美| 黄色性爱网网| 国产一区二区精品久久99| 春色91| 97青娱乐超碰久久| 国产欧美美女免费观看视频| 丁香五月电影| 欧美九九爱| 99无码视频| 免费一级欧美片片线观看| 亚洲二区精品在线观看 | 精品国产乱码久久久久久久久1| 大香网站| 99久久9| 91精品91久久久中77777| 99久久久久久亚洲精品不卡| 蜜桃午夜视频一区二区| 精吧天堂| av国产无码| 99热这里都是精品| 最新日本中文字幕| 国产精品宅男免费| 欧美色三级片91| 旡码电影特区| 插B在线观看| 无马一区二区| 国产91啪| 清纯唯美激情四射| 性影在线视频| 日本有码影片下载 | 九九九九精品一区| 97在线视频观看免费| 亚洲麻豆18发?| 精品亚洲| 9久久精品| 99re在线观看| 国产精品爆乳懂色蜜乳| 亚洲九区| 亚洲情色综合网| 小说区 图片区色 综合区| 太久视频| 欧美一级专区免费大片| 成人无码在线超碰网| 男女激情黄色网址| 久久久精| 午夜精品五区| 色天堂在线观看| 亚洲精品成人动漫在线| 91亚洲青青草原精品1区| 丝袜天堂网| 国产日逼视频| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊| av橘色网站| 日本高清_区二区三区| 中出在线视频| 亚洲成人激情小说视频| 久久国产在线一区二区| 国产美女裸体秘 永久无遮挡| 午夜精品久久久久久久久久久久久| 国语精品av| 骚熟女AV网| 日韩黄色片子| 91亚州欧美| site:sinbotex.com| 97色碰| 啊啊啊啊啊啊在线观看| 日韩无码精品综合久久| 国产专区第一页| 五月天丁香网| 加勒比伊人影院| 青青草在线视频美女| 美女骚尻视频| 少妇综合| 黄片www.| 加勒比AV网| 97在线视频观看免费| 在线A日本| 日本欧美色| 99e久久国产精品| 日本三级网页| 欧美亚洲影视| 伊人骚琪琪亚洲天堂网站| 26uuu国产亚洲综合| 一区二区 韩日AV| 午夜福利一区二区三区四区五区色婷婷| 日韩情色一区二区| 小视频玖玖| 草草影院在线视频| 中日韩久久久免费看| 国产又黄又爽又刺激久久久久久| 国产成人资源| 中文字幕,人妻,日韩| AV男人天堂网| 男人的天堂2018东京热啪啪啪| 午夜精品久久久99| 日本αv| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 中文字幕一二三av| 十八禁的黄污污免费网站| 亚洲色悠悠久久88| 久久黄色视频一区二区三区| 91美女在线视频| 亚洲AV操| 少妇内射视频| 91精品丝袜在线观看| 亚洲黄a三级三级三级看三级| 国产精品宅男免费| 亚洲欧美综合网| ′ !γ}丶。。久久精品欧美一区二区三区| 嫩草 我啊~嗯~在线| 日本免费亚洲欧美| 另类天堂| 中文字幕精品码亚洲| 久久有碼| 美女主播色欲91抠b在线播放| 久草国产在线视频| 人妻内射一区二区在线视频| 国产白嫩漂亮KTV在线| 91蜜臀人妻中文字幕在线| 天天干天天爽| 欧美日韩性爱无码| 秋霞久久亚洲精品成人| 天天干人人干天天日97| 久久黄片国产一区二区| 亚洲Av诱惑| www.色婷婷色综合| 日韩一级成人毛片免费观看| 婷婷色色五月天福利| 色婷网| 豆花视频操逼网址| 精品九九九九九| 狠狠做深爱婷婷久久二区| 国产又大又粗又长视频在线| 日韩一级特黄av毛片| 第四色奇米影视777| 亚洲精品xxx| 天天干人人看综合| 96久久久| 精品无码欧美三级| 伊人久久综合影院| 中文字幕性感少妇av| 国产日韩欧美中文在线播放 | 淫荡熟女乱伦网| 人人贴人人摸| 国产亚洲禁久一区二区| 九九香蕉网| 玖玖爱免费观看视频| 另类TS人妖一区二区三区| 亚州色综合| 亚洲久久久久| 天天做日日做| 九九综合| 亚州图片第一页| 狠狠躁天天躁日日躁97| 天堂资源站| 青草影院内射高潮| 色九久| 无码137片内射在线影院| 日本高清电影欧美色图| 一类无码操逼视频| 日韩极品无码B| 能在线播放的国产三级| 一本久道在线综合视频| 日韩福利综合一区| 亚洲中字幕日本一区二区三区| 人人操人人狠狠操| 日韩ab网| 欧州一区二区三区四区| 99re9这里只有精品| 人人妻人人澡人人爽久久av| 毛片电影一区二区三区| 后入精品| 丰满的三级少妇欧美久久久| 日韩久射综合| 九九人人操| 懂色AV网| 久jiu久神马影院| 九九九网站| 色妺妺在线视频| 日韩一级久久毛片| 九九九九九九成人| 精品久久久久av影院| 做爱福利视频一区二区| www国产天美久久久| 黄色毛片A片| 蜜桃久久精品一区二区三区| 逼逼逼逼操操操操操操操操操午夜剧场 | 精品国产三级av韩国在线| 精品区9| 午夜啪| 国产久久日韩网站导航| 大屁股人妻女教师撅着屁股| 中文字幕伊人| 久热99| 国产一级舔足在线观看| 伊人精品视频| 色婷婷狠狠| 九热中文字幕| 日韩人妻精品| 久热伊人99re| 日韩亚洲国产视频| 精人妻一区二区三区| 特污免视频| 肏逼福利网站| 国产亚洲色婷婷99精品91| 色色福利| 国产91 丝袜在线播放00-百度| 亚洲中文电影| 99热最新网址| 国产熟妇 码视频户外直播| 99re这里| 91亚洲不卡一区| 女同性恋久久| 日韩无码精品综合久久| 久久 精品| 亲子敌伦对白在线播放| www.91欧美| 日韩精品99999| 91深夜夜| 久久免费少妇| 成人AV在线网站| 久久色一区| 午夜福利成人免费视频| 亚洲三区视频| 操逼网站网站| 精品人妻久久久久一区二区三区| 欧美日韩青操| 男人下部插入女人下部| 麻豆2区1区天美| 十八禁的黄污污免费网站| 亚洲图片第一页| 青青伊人加勒比海| 330dv亚洲成年视频网| 欧美乱色| 日韩在线观看字幕精品| 久久亚州精品成人Av无| 男人天堂网站| 国产强奸乱伦无码视频| 97超碰欧美精品| 欧美色图成人网一区二区| 亚洲综合色男人网| 精品99999久久久久久| 婷婷久久网| 1769一区二区| 国产精品熟女九色九色蜜臀| 天天上日日上日韩精品| 青青久久艹| 97超碰精品图片| 欧美在线|亚洲| 熟女欧美日韩综合婷婷| 黄呦呦在线| 午夜情侣自拍网站| 天堂日本亚洲欧美| 怡红院怡春院| 亚洲狼狼干综合1| 97天天摸天天碰| 天天插天天插| 国色天香av| 人妻啊啊人妻啊啊| 久久久久久久久久久久久久久性生活视频 | 亚洲婷婷五月天| 国产在线视频二区| 国产精品无码av在线| 女人被男人桶爽视频网站| 亚洲综合九九| 欧洲性爱无码区| 中文字幕乱码在线观看| 99色网| 78操B| 日本一道在线播放高清| 欧美日韩国产成人高清| 免费簧片在线观看| 自拍偷拍 高清无码| 亚乱色| 青青草丝袜在线视频| 国产在线精品偷| 国产欧美精品日韩区二区麻豆天美| 熟女丝袜视频| 久久久九九九九| 久久亚洲天堂| 91精品人妻一区二区三区蜜桃| 天天亚洲| 午夜超爽| a天堂视频| 日本三级中国三级99人妇网站| 色噜噜人妻av 中文字幕| 丝袜内射| 操老熟女AV| 国产欧美另类久久久精品课程| 亚洲欧美天堂| 福利在线观看一区二区| 99色悠悠| 国产女人高潮嗷嗷嗷叫小说| 色综合久久88色综合久久天天| 亚洲一区日韩| 欧美国产有色电影| 国产9l 大屁股| 亚洲欧洲无码bt精品合集| 亚洲第一黄色av网站| 日本狠狠干| 亚洲少妇在线影音| 天天噜| 久久精品中文字幕观看| 亚洲丝袜色| 欧美91精彩| 精品制服美女中文一区二区三区| 亚洲97在线| 色久桃花影院在线观看| 亚洲宅男天堂| 色九色久| 亚洲欧美日韩免费电影| 少妇被玩视频二三区| 精品女同一区二区三区| 久久黄色性爱视频| 亚洲伊人久久精品狠狠在线| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 婷婷丁香成人| 国产青青美女玩逼视频| 久久精品国产亚洲AV清纯| 亚洲色欲天天人妻无码系列专区| 亚av顶级裸体一区二区三区四区五区 | 亚洲另类欧美精品| 26uuu欧美| 精品女同一区| 国产曰批免费观看久久久| 国产亚洲色婷婷久久99精品91葵花宝典 | 啊啊啊好想要| 黑丝内射一区二区三区| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 日韩有码免费视频| 在线播放欧洲免费av| 日韩成人性日韩成人性爱视频在线免费观看| 中文字幕一区二区日韩网| 内射中出日韩在线观看视频| 国产一区在线播放| 性爱av网站| 蜜桃狠狠色伊人亚洲综合 | 亚洲天堂久久久久久粉红视频| 麻豆国产免费影片| 欧美人妻一区二区| 粉嫩不卡一区二区性爱| 操老熟女AV| 国岛片视频| 99www.bibizy香蕉资源国产一区二区三区高清 | 中文字幕久热视频在线| 东北女人| 麻豆九九九| 欧美一区二区三区不卡高清视频| 丰满少妇一区二区三区专区| 久久久新亚洲AV| 日韩人妻少妇中文字幕| 国产高清视频无码在线| 人妻天天夜夜爽一区二区| 精品久久久一本一道| 色香色欲天天综合网天天来吧 | 啊啊啊啊,啊啊好多水| 99re免费视频精品全部| 日本天堂网| 国产路线专区| 亚洲国产剧情少妇激情| 无码 黑人一区二区三区| 神马久久啊啊| 欧美性爱视频免费一区一A| www.成人无码| 美女在线H91| 亚欧免费| 婷婷10月天青娱乐| 麻豆国产原创AV色哟哟| 一起草三级AV电影在线观看 | 91肉片| 2017大香蕉国产精品久久| 1禁看欧美黄片免费看| 99在线精品观看视频中文 | 狠狠夜色午夜久久综合在线| 91精品女厕偷拍视频| 日本三级韩三级99久久| 97在线公开视频| 激情第四色| 99精品欧美一区二区三区桃色| 国产污视频麻豆传媒一区二区 | 国产成人精品日本亚洲语言| 啊啊啊啊啊啊在线| 欧美老妇综合网| 国产精品久久久久中文字幕| 熟女熟妇一区二区三区视频| 不卡在线一区,精品一区二区三区中| 波多野结衣之双飞调教在线播放| 职场同事知名国产国产精品久久欧美日韩 | 96久久久久久久| 日韩三级在线观看mp4| 熟女被操视频网址| 性爱网站一区二区| 亚洲国产日韩精品久久久| 日产中文字幕2020| 五月天色五月| 天天澡天天狠天天天做| 啊啊啊啊,啊啊好多水| 嗯啊啊啊轻点视频 | 97久久久| 亚洲美腿丝袜香蕉影视欧美成人| 日本九九久久99播| 国产高潮AA片免费看| 操人人| 亚洲97超碰| 色阁阁AV综合网| 午夜福利久久久噜久噜久久综合 | 性爱乱伦网址| wwwxxx日本爽| 免费精品无码一级毛片牛牛影视| 青青草玖玖爱| 亚洲色图国产另类| 欧美激情亚洲色图| 欧美黄页在线| 久久亚洲婷婷| 亚洲国产日韩欧美熟妇在线| 日韩一性一交一A片俄罗斯| 欧美极品色| 亚洲诱惑| 91熟女综合| 91亚洲电影| 蜜臀网址在线| 91超碰在线观看| 国产少妇高潮| 色香在线| 五月天久久婷婷亚洲 | 国产1769在线| 国产做?爰片久久毛片?片美国| 男人高清无码一区二区| 成人乱人伦一区二区| 国产成人超碰在线| 偷拍盗拍亚洲色图图片| 久久东京热成人| 五月天精品| 5252色欧美在线男人的天堂| 欧亚韩国999| 熟女网站最新| A男人的天堂| 碰人碰碰人人开房人肉| 天天躁夜夜躁狠狠躁AV| 人人操人人射人人干| 人妻少妇久久中文| 玖玖超碰熟| 亚洲,欧美,综合网| 久久久久久久久一区二区三区| 中文不卡视频| 女性喷水高潮在线观看| 国产黄色小视频网站| 欧美大香蕉久| 成人三级片无码| 亞洲久久直播| 色综合av男人天堂| 午夜免费福利视频一区| 国产精品久久久亚洲一区| 久草成人福利导航| 亚洲情色在线| 99久在线精品99re8| 婷婷10月天青娱乐| 91色婷婷综合久久中文字幕二区| 视频国产欧美在线播放| 95自拍视频在线观看| 操屄不卡视频| 久久9 9 9精品| 东京热av男人的天堂| 公司1区2区3区精产精| 欧美草草高清日韩视频| 国产综合色精品在线观看| 黄色AAAAA欧美| 亚洲AV永久无码一区仙野| 蜜桃成人1区2区3区| 欧美 日韩 另类 亚洲| 免费男人的天堂| 日本道不卡| 色欲av一区二区三区蜜芽| 日韩中文字幕二区| sss视频华人在线| 嫩草 我啊~嗯~在线| 午夜超碰| 8050无码八戒| 欧美综合第一| av2014 日韩在线中文字幕| 亚洲第一页第二页激情| 国产日韩欧美中文在线播放| 久久久爆乳翘臀一线天伦理视频| 一区二区不卡| 日本精品加勒比海一区| 黄色片一区二区三区四区五区 | 天天爽夜夜欢视| 大香蕉日韩欧美| 永久免费av无码网站国产app| 免费一级毛片在线视频观看| A啊啊在线观看| 欧美亚洲首页| 国产树林里野战在线看| 91久久18禁| 午夜综合在线| 欧美性爱一区二区| 久久超碰大香蕉| 久久婷婷苹果| 日韩欧美亚洲一区二区三区影院| 少妇与黑人高潮在线| 好湿好紧视频| 国产无码一二三区| 97在线资源| 岛国在线国产| 97精品一二区| 中文 人妻 制服| 首页中文字幕中文字幕免费| 人人澡综合涩| 免费一二区| 综合免费无码中文| 成人熟女区| 在线综合 亚洲 欧美中文字幕| 色yeye成人免费视频| 日韩精品熟妇| 国产真乱mangent| 亚洲精品天天影视综合网| 高清无码91| 九九色热| 四虎av在线| 色人久久| 天天色欧美| 99精品网| 国产乱子伦一区二区三区在线观看| 99视频精品| 极品色综合| 精品国产少妇高潮视频| 无码人妻精品酒店| 毛片17S| 操屄日韩| 欧美97日韩精品| 隔壁邻居波多野结衣中文字幕| 蜜桃久久久久久久| 天天天做天天天爱天天天爽| 亚欧国产无码精品在线| 欧美热图99| 美女诱惑爱爱| 免费试看60秒| 大香蕉在线视频重口味毛片在线| 老司机福利青青草| 亚洲欧洲色情高清| 日韩偷拍一区二区三区| 久久久久9999精品九九九| 人妻 丝袜美腿 中文字幕| 久久原创中文| 狠狠久久亚洲欧美专区| 午夜性刺激视频免费观看| 亚洲五区熟女| 玖玖玖玖精品国产剧情| 999国产精品999久久久久久| 韩国久久97| 欧美大波激情xxxx| 中文伊人大香蕉视频| 日韩猛交| 久久久禁| 中文字幕精品一区二区精品| 日韩日本欧美在线观看| 亚洲综合伊人| 人妻天堂综合网| av无线看| 美欧色综合| 目产99999久久999| 色999;丁香五月| 欧美韩日精品99综合| 欧美亚男人的天堂| 日韩激情啪啪| 综合影院永久入口国产| 99这里都是精品| 亚洲精品97在线| 亚洲黄色a级片| 色路综合| 色香综合天天影视综合 | 久久美女国产| 天美91| 99精品丰满人妻无码| 丝袜六区| 日本黄色精品专区网站| 欧美日韩制服| 亚洲精品不卡一二三区| 色狠狠综合| 欧美色图自拍| 97超碰亚洲| 大香蕉操久久| 91色婷婷综合久久中文字幕二区| 国产精品国产自产高清AV| 大屁股xxxxx| 国产精品视频在线观看| 蜜桃臀AV在线| 欧美另类自拍| 九九热精品在线| 人人插人人摸人人| 黄色片A级一区二区三区| 韩国嫰模上门援交视频| 免费人人搞97| 欧洲综合视频| av婷婷色婷婷色六月| se吧提供91精品国产91久久久久久 | 日熟女| 免费AV中文网在线观看| 欧色网址| 国内毛片四区| a啊啊啊啊啊啊啊啊一区二区| 久久99精品九九久久久婷婷| 97超碰色屌| 日韩亚洲美女一区久久| 另类在线| 探花激情视频| 午夜视频好爽啊| 日韩有码 一区二区三区| 国产精品久久久 | 日本三级一区二区 在线| 国产美女在线精品免费看| 大香蕉中文在线| 91爱看| 国产AV久久久蜜爱影集| 亚洲性爱无码乱伦av| 亚洲天堂7777| 亚洲精品人妻吞精av| 免费在线黄片视频| 国产成人精品无码久久| 欧美,日韩综合久久| 久久久久人妻二区精品叶可怜| 人妻无一区二区三区| 一本久久精品中文字| 9999九九九久久久| 国产在线综合网| 大香蕉国产中文自拍| 亚洲二区精品在线观看| 高清成年美女黄网站免费大全| 性爱网站一区二区| 黄色电影在线播放综合网站| 日逼视频日本| 手机看片1024你懂的国产| 國產尤物AV尤物在線觀看| 欧美一区二区观看在线| 国产精品无码论坛| 120分钟婬片免费看| 日韩三级视频一区二区三区| 六十路日本| 水澄无码AV| 95人妻爽爽人人做人人澡 | 男女无套 免费网站| 亚洲欧美国产va在线播放频| 精品成人亚洲午夜电影| 国语av最新自产拍在线观看| 亚洲制服aⅴ中文字幕| 屁屁影院一区二区三区国产| 啊视频在线| 久久亚洲骚逼综合| 麻豆一区二区三区精品| 日日玩天天干| 亚洲成人贴图| 国产日韩欧美中文在线播放| 粉嫩av在线一区二区| www.色综合| 泰国AV在线观看| 麻豆天美在线喷水AV| 美女t无毒不卡不卡| 日本成熟少妇A∨网站| 日韩免费高清大片在线| 人人爱人人操人人性| 五月天综合| 97国产天堂岛| 日日不卡av| 人人操人人插人www| 激情综合亚洲| 蜜臀99999| 密臀在线视频| 午夜.DJ高清在线观看免费7| 日本高清一区二区在线| 91丝袜美腿网站| 久久久久久久久久久999| 男人的天堂三级| 被男人吃奶很爽的毛片| 五月丁香综合激情| 欧美亚洲激情小说| 欧美亚洲色的图| 亚洲黄色视频在线观看视频| 另类小说五月天| 亚洲综合射| 精品免费视频国产一区| 久久婷婷热| 吉田爱美AV在线| 日本久久久久久久久久| 欧美成人A√在线一区二区| 亚洲久热| 天堂射| 精品免费一区| 色播综合| 亚洲日韩东京热一区| 欧美日本不卡| 日本黄色大片一级视频免费麻豆| 午夜一区| ...日韩成人一区二区三区字幕| 日韩成人高清一区二区| 91麻豆天美国产欧美日| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 亚洲欧综合另类无码一区| 国产欧美一区二区| 91伊人| 在线v中文字幕一区二区三区| 亚州久久9| 秋霞操逼片| 亚洲少妇诱惑| 成人免费性爱视视| 啊啊啊啊啊在线观看网址 | 九九英色视频| 综合av影片| 亚洲字幕一区二区| 少妇三P| 综合影院永久入口国产| 欧美九九99久久精品| 91天天看| 亚洲熟妇乱女区二区三区| 97在线视频网站| 国产欧美日韩女同性恋ww喷水精品| 欧美丝袜中文字幕07在线| 白天啪啪晚上啪啪视频| 97国产色图 | 日本一片一区| 26uuu欧美日韩| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 男人午夜天堂| 欧美日韩国第一区| A 天堂| 麻豆AV短剧| 亚洲AV无码翔田千里网站| 久噜噜| 丁香婷婷五月| 人人噜夜夜操| 中文字幕亚韩| 巨乳特殊服务按摩| 婷婷精品视频| 翔田千里A片一区二区| 97色欧州| 欧美大香蕉专区网| 一区二区三区一亚洲中文字幕、综合区灬 | 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 久久久久国产精品喷潮免费观看臀| 日日干夜夜欢| 久久久网站| 色天使AV天堂| 日本一区三级韩国| 欧美性爱日韩高清| 91精品久久久久久77777| 久久女婷| 人人做,人人操,人人摸| 91影视亚洲| 久久五月视频| 五月丁香黄色网| 亚洲精品不卡一二三区| 97人妻碰碰中文无码久热丝袜| 好爽视频在线观看视频| 好好的日:com久久九九| 无码精品一区二区三区潘金莲| 999国产精品999久久久久久| 江都AV在线| 国产乱伦搜索结果91P| 97精品在线| 国产欧美日韩女同性恋ww喷水精品| 97色亚洲| 久久久九精品| 能看的av| 日韩av在线精品观看| 97日视频| 日韩欧美视频青青| 亚洲精品国产熟女| 78久久| 99热日| 亚洲色啪| 久草国产在线视频| 九久久精品| 嫩草伊人久久精品| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 欧美高清无码免费视频高清版| 夜色97| 欧美最婬乱婬爆婬性视频 | 欧美激色| 丁香激情五月| 高清无码 国产精品| 人人性爱视频免费| 欧美色亚洲色| 亚洲综合性网址| 伊人大香蕉在线| 在线无码操| 性色av大全| 日韩青久久| 久噜噜| 亚欧美天堂在线| 长长久久88视频| 日韩性爱再线视频| 美女操逼A A| 青娱乐休闲视频在线观看| 天天久久久久久| 老司机午夜精品福利视频一区二区| 九九热在线视频| 99久久久无码精品国产人| 国产白丝精品在线观看| 亚洲高清在线se| 丁香婷婷激情五月天无毒不卡| 99色色网| 日韩探花精品在线视频| 国产精品精品系列在线观看| 精品天堂| 啊啊啊啊免费视频| 91中出在线| 久久久久久久久久黄色网| 欧美熟妇乱码在线一区| 另类图片五月| 亚洲激情av| 亚洲av乱伦色图网站| 人人妻碰人人免费| 青娱乐淫乱1314| 欧美精品系列| 日韩三级av片| 91色伦| 久啪视频| 亚洲色图A| 精品人妻伦一区二区三区久久| 在线情色电影 91大| 日韩AV中文字幕电影| 亚洲精品一区二区三区新线路| 裸体美女国产免费久久久网站| 丁香五月天社区| 色噜噜狠狠色综无码久久合欧美| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 女人天堂网| 亚洲精品 欧美精品| SUV一区二区在线看| 91久久久久久久| 亚洲精品欧洲色| 久久精品成人| 97免费视频在线| 久久伊人最新网址视频| 国产精品久久久久久亚洲色欲| 青草伊人网| 国产熟女无套内射| 强奸抽插av| 伦伦成年午夜免费视频| 探花一区在线| 色五月激情网| 日韩影片中文字幕一区二区三区| 亚洲大色堂| 后入内射蜜桃臀| 日韩精品三级片长长久久| 无码久| 亚洲中文字幕av | 日亚韩精品视频二区三| 亚洲综合在线视频| 福利风月五月天影院| 长长久久曰曰夜夜成人网| 日本少妇va7777| 天天拍天| 欧美色图20p| 久久久久亚洲?V片无码V| www.91色| 人人人人人人少妇| 亚洲色图国产另类| 人人噜夜夜操| 在线国产一区二区av| 欧美夜夜狠| 日本天天干天天搞一区| 欧美91网| 色偷偷超碰亚洲| 日韩国产精品人妻无码久久久| 18禁精品网站在线看| 亚洲夜色在线| 欧美色图 人妻| 小电影欧美91| 欧美1区二区三区公司| 国产一区二区精品久久99| 国产精品分类在线观看| 五月激情天| 日本九九久久99| 91色狼| 深田咏美亚洲精品福利社| 白丝AV网站| 久久99干一本高清| 国产成人99久久亚洲综合| 啪啪综合网| 加勒比东京热五月天天堂网| 97超碰影音| 91社区伊人| 国产动漫操逼视频| 330dv亚洲成年视频网| 人人操人人色网| 久久这里只精品99re66图| 夜夜高潮夜夜爽| 中文字幕精品三级久久久| 思思热在线视频在线| 婷婷五月丁香五月| av 模特一区了| 国产黄色小视频网站| 午夜精品99久久久久传媒| 国产一区二区在线播放| 久久性爱大全| 99黄页网站| 国产三级在线现体验区| 久九干| 懂色aV一区二区天美传媒| 久热这里| 亚洲深夜福利| 立川理惠加勒比无码| 91熟女熟妇视频网站| 玖玖草久草99蜜月一区二区三区| 激情小说图片亚洲首页| 亚洲成av人片色午夜乱码| 亚洲综合射| 中文字幕国产| 久久久18禁| 日韩无码精品综合久久| 啊啊啊好舒服视频在线观看| 欧美真人抽搐一进一出gif | 乱色老一区二区三区的观看方式| 草莓精品视频在线免费观看| 日日夜夜骚| 欧美日韩国产一区二区小黄片大全| 亚州AV无码国产精品| 1024午夜激情男人的天堂| 欧美福利视频啊啊啊啊| 97人人中文网| 丰满美女一级毛片在线播放| 99热精品免费| 亚洲人综合19| 96精品在线| 91欧美网| 久操99| 91大神精品长腿在线观看网站| 99青青草国产视频| 51久久夜色精品国产麻豆| 91老熟女逼| 精品999999| 熟女一区二区| 中文字幕五月婷婷免费| 亚洲综合射| 欧美疯狂做爰xxxx| 国产精品噜噜噜日日日| 吻戏激情性巴克| 大香蕉一人| 亚洲丝袜色图| 97超碰人人操人人操| 东北老女人的激情视频| 91丨九色丨国产丨人妻在线| 密臀AV在线| 精品成人亚洲午夜电影| 国产精品久久久999| 午夜偷拍久久熟女| 色九九久九九| 无码人妻一区二区一牛影视| 啊啊啊免费| 少妇人妻精品| 风流老熟女一区二区三区l| 久久久久久久久久久久97| 极品色综合| 诱惑网综合| 91麻豆天美传媒HD| 国产中文字幕曰本毛片| 欧美啪啪天堂| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 熟妇熟女视频一区二区三区| 天天干人人乐| 久久久久久性爱片| 波多野结衣先锋影音| 大香蕉淫人| 日本A级视频| 婷婷久久网| 综合av社区| 桑老女人九区| 国产高清不卡视频| 草草草视频在线免费看| 嗯~啊~快点 死我视频免费看网站| 91精品91久久久中77777| 9丨亚洲一区二区在线| 久久亚洲一区二区色婷婷| 中文字幕视频2区| 91看黄片| 加勒比综合88| 无码男人天堂| 欧美中文字幕男人天堂久久精品| 欧美激情中文字幕另类小说| 一级AAA片一区二区三区| 婷婷情色五月天| 亚洲夜色在线| 国模少妇一区二区三区| 日韩 国产 欧美自拍| 人妻熟女一区二区三区视频| 欧美国产有色电影| 懂色AV一区二区三区| 精品久久久久久久| 亚洲图片欧美91N| 国产精品无码AV网站| 日韩性爱小视频| 欧美综合色图网| 亚洲激情 欧美色图| 蜜臀久久99精品久久久老,,| 强奸乱伦av电影| 亚洲图片日本AⅤ欧美在线| 日日操夜夜操天天操免费观看麻豆| 人妻少妇久久中文| AV在线资源| 又大又长又爽| 午夜福利视频在线一区| 欧美爱三级日韩久久| 久久久96| 伊色久人大在线| 97超级欧美| 国产久久久9999| caorenqi shipin| 日本高清_区二区三区 | 中文字幕女同在线| 中文乱码99| 久热这里| 夜夜爽33333| 五月天婷婷小说| 九九在线视频| 97人人草| 久久久麻豆精品| 簧片免费看视频| 男人的天堂一区三区|