
文章插圖
開啟事務,創(chuàng)建一個全局事務,如果是seata.store.mode=db的話,向global_table表插入一條記錄
2. 分支事務注冊

文章插圖

文章插圖
DefaultCore#branchRegister()

文章插圖

文章插圖

文章插圖
如果是AT模式,這里調(diào)用的就是ATCore#branchSessionLock()
ATCore#branchSessionLock()檢查是否拿到鎖了

文章插圖

文章插圖

文章插圖

文章插圖

文章插圖

文章插圖
具體每種鎖的實現(xiàn)就不往下看了,挑其中一個看下,就RedisLocker吧

文章插圖
總之,分支注冊的時候需要檢查鎖,拿到本次事務中所涉及的所有需要加鎖的行的鎖才能注冊成功
所有行都加鎖成功,分支注冊才算成功,才會返回true
再回到AbstractCore#branchRegister(),整個方法是放在SessionHolder#lockAndExecute()中執(zhí)行的

文章插圖

文章插圖
總結(jié)一下,分支注冊:
- 創(chuàng)建一個BranchSession
- 加鎖,獲取所有行的鎖
- 將BranchSession加到GlobalSession中
- 返回branchId

文章插圖
分支注冊,創(chuàng)建BranchSession,獲取全局鎖成功后將branchSession加入globalSession
3. 提交全局事務

文章插圖

文章插圖
首先判斷全局事務狀態(tài)是否為begin,如果不是則不應該提交 。如果是,則將事務active置為false,釋放全局鎖,判斷是否可以異步提交 。分支類型是AT的都可以異步提交,因此AT模式,默認是異步提交 。如果不能異步提交,則采取同步提交 。
3.1. 同步提交

文章插圖

文章插圖

文章插圖
遍歷所有已注冊的分支事務,向分支發(fā)送同步請求,告訴它全局事務開始提交了,不出意外的情況下返回分支狀態(tài)是二階段提交成功 。當所有分支都提交成功,則返回true,于是全局事務提交成功,返回全局事務狀態(tài)為已提交 。如果有分支提交失敗,則返回false,全局事務提交失敗,返回全局狀態(tài)為提交失敗 。如果拋異常了,則會有定時任務稍后重試提交 。
經(jīng)驗總結(jié)擴展閱讀
- 觀察者 CH58X/CH57X/V208 Observer例程討論講解
- Seata 1.5.2 源碼學習
- Sql Server性能排查和優(yōu)化懶人攻略
- 分布式事務框架 Seata 入門案例
- Azure DevOps Server 入門實踐與安裝部署
- 【Serverless】快速集成云函數(shù)HarmonyOS
- Eureka Server 實現(xiàn)在線擴容
- Seata 環(huán)境搭建
- 【Serverless】云函數(shù)微信小程序
- SpringCloud整合分布式事務Seata 1.4.1 支持微服務全局異常攔截
