一、AT模式開發(fā)實戰(zhàn)
1)準(zhǔn)備階段

2)啟動階段

2)正常提交

3)異?;貪L


4)undo_log






before_image

after_image

放開斷點

庫存跟before_image一致
5)執(zhí)行流程






二、TCC模式開發(fā)實戰(zhàn)
1)準(zhǔn)備階段


2)配置多數(shù)據(jù)源


3)正常提交

4)異常回滾

5)執(zhí)行流程


通過接口中注解管理后續(xù)的二階段提交和回滾

TCC和AT的區(qū)別是需要我們自定義二階段commit和rollback邏輯
三、Seata AT模式源碼解析(Client端)
1)概述

TC主要在Server端,通過Netty進(jìn)行通訊

2)事務(wù)日志rollback_info內(nèi)容解析


TableRecords

TableMeta










Row

Field


3)事務(wù)日志管理器UndoLogManager





4)Seata數(shù)據(jù)源代理

4.1)DataSourceProxy數(shù)據(jù)源代理類


沒做什么事,主要針對構(gòu)造方法注入的targetDataSource進(jìn)行操作



DefaultResourceManager

日常開發(fā)表元數(shù)據(jù)信息配置在properties配置文件中除非更新版本不會變,如果配到配置中心就有機會被改變

4.2)ResourceManager資源管理器(RM)



不開啟全局鎖可能出現(xiàn)分布式事務(wù)過程中數(shù)據(jù)被其他服務(wù)修改,但是效率高

DefaultResourceManager,默認(rèn)BranchType為AT模式






Seata的jar包

EnhancedServiceLoader通過ResourceManager.class找到此文件獲取對應(yīng)實現(xiàn)類


通過Netty將資源向TC注冊
4.3)ConnectionProxy連接代理器類



步驟a:LOCK_RETRY_POLICY.execute()





步驟b:doCommit()——分支事務(wù)提交


、
register()


向TC注冊分支成功后返回分支Id

將返回的分支Id存儲在ConnectionContext中
flushUndoLogs()


步驟2

步驟2

步驟3

步驟3







report()


步驟b:doCommit()——本地事務(wù)提交并查詢?nèi)宙i






步驟c:rollback()

4.4)StatementProxy和PrepareStatementProxy




AbstractStatementProxy

StatementProxy

ExecuteTemplate



SQLRecognizers

通過dbType選擇不同數(shù)據(jù)庫,通過sqlType確定Delete、Insert、Select、Update



ExecuteTemplate

ExecuteTemplate
Executor







生成前鏡像

默認(rèn)ONLY_CARE_UPDATE_COLUMNS為true,一般只查更新了的列


5)AT模式的兩階段提交
5.1)一階段處理


5.2)二階段的提交處理



addToCommitQueue(context)一般都是先返回二階段提交狀態(tài),接下來再異步刪除UndoLog
5.3)二階段的回滾處理








