https://www.cnblogs.com/jian0110/p/14925087.html
https://www.cnblogs.com/jian0110/p/14762509.html
- AP: Application 表示應用程序
- RM: Resource Manager 資源管理器,比如數據庫
- TM: Transaction Manager 表示事務管理器,協調事務和管理資源,類似於Spring的Transaction Manager。
一、AT模式介紹
同樣地,還是得先復習下分布式事務的相關理論部分:AT模式是Seata最主推的分布式事務且基於XA演進而來的解決方案,主要有三個角色:TM、RM和TC,其中TM和RM作為Seata的客戶端和業務集成,TC作為Seata服務器獨立部署。TM向TC注冊一個全局事務,並生成全局唯一的XID;在AT模式下,數據庫資源被當做RM,訪問RM時,Seata會對請求進行攔截;每個本地事務提交時,RM會向TC(Transaction Coordinator,事務協調器)注冊一個分支事務。
從三個角色TM、RM和TC的角度來記錄具體的流程的話,可以總結如下:
- TM向TC注冊全局事務,並生成全局唯一XID;
- RM向TC注冊分支事務,並將其納入到該XID對應的全局事務范圍。
- RM向TC匯報資源的准備狀態
- TC匯總所有事務參與者的執行狀態,決定分布式事務全部回滾還是提交
- TC通知所有的RM提交/回滾事務
從具體的微服務角度總結,假設分別有三個:MicroService-1, MicroService-2, MicroService-3,流程圖如下:
二、Seata AT模式的實現原理
1. AT模式的第一階段實現
解析業務SQL,更新業務數據,保存更新前后鏡像到undo_log。在業務操作數據庫流程中,Seata會基於數據源代理(0.9以后支持自動代理)對原執行SQL進行解析。之后通過本地事務的ACID特性,將這兩步操作(保存業務數據前后鏡像到undo_log, 更新業務數據)在本地事務中進行提交。
訂單服務:
TM(microService):seata-order-service
RM(DB Resources):jdbc:mysql://127.0.0.1:3306/order
@GlobalTransactional // TM開啟全局事務 @Transactional(rollbackFor = Exception.class)
// 這里先檢查有沒有庫存了, 生產環境下這里是需要for update數據庫鎖,或者分布式鎖
1.TCC補償型方案(互聯網最常用的方案)
TCC 是一種比較成熟的分布式數據一致性解決方案,實際上是把一個完整業務拆分為三個步驟:
Try:主要是數據的校驗或者資源的預留;
Confirm:確認真正執行的任務,只操作Try階段預留的資源;
Cancel:取消執行,釋放Try階段預留的資源。
其實TCC是2PC的思想,第一階段通過Try進行准備工作,第二階段Confirm/Cancel表示Try階段操作的確認和回滾。