解決分布式事務的方案 —— Seata
1. 認識 Seata
解決分布式事務的方案有很多,但實現起來都比較復雜,因此我們一般會使用開源的框架來解決分布式事務問題。在眾多的開源分布式事務框架中,功能最完善、使用最多的就是阿里巴巴在 2019 年開源的 Seata 了。
Seata 的事務管理中有三個重要的角色:
- TC(Transaction Coordinator)事務協調者:維護全局和分支事務的狀態,協調全局事務提交或回滾,相當于監控中心。
- TM(Transaction Manager)事務管理器:定義全局事務的范圍、開始全局事務、提交或回滾全局事務。
- RM(Resource Manager)資源管理器:管理分支事務,與TC交談以注冊分支事務和報告分支事務的狀態,并驅動分支事務提交或回滾。
2. 微服務集成 Seata
引入依賴
<!-- seata -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
修改配置
seata:registry: # TC服務注冊中心的配置,微服務根據這些信息去注冊中心獲取tc服務地址type: nacos # 注冊中心類型 nacosnacos:server-addr: 192.168.101.68:8848 # nacos地址namespace: "" # namespace,默認為空group: DEFAULT_GROUP # 分組,默認是DEFAULT_GROUPapplication: seata-server # seata服務名稱tx-service-group: hmall # 事務組名稱service:vgroup-mapping: # 事務組與tc集群的映射關系hmall: "default"
3. Seata 工作模式
Seata 支持四種不同的分布式事務解決方案,Seata 默認使用的是 AT 模式:
- AT
- XA
- TCC
- SAGA
這四種方案可以滿足 CP 和 AP 的需求,比如:XA 可以實現 CP 即強一致性,AT 可以實現 AP 最終一致性,四種模式中 AT 模式使用較多,本課程重點講解AT模式。
3.1 AT 模式
工作流程圖

流程說明:
- TM 通知 TC 開啟全局事務,TC 記錄全局事務狀態;
- TM 調用所有 RM,開始執行分支事務,然后 RM 向 TC 注冊分支事務;
- RM 執行自己的 sql 并進行提交,同時記錄日志到 undolog 表中;
- RM 向 TC 匯報自己事務執行的狀態;
- TM 通知 TC,提交或回滾全局全局事務。TC 匯總所有 RM 的事務執行情況,并通知所有 RM 執行提交或回滾操作
- 提交:刪除 undolog 表中的日志
- 回滾:RM 根據各自 undolog 表中的日志,反向操作,操作成功后刪除 undolog 中的日志
3.2 XA 模式
工作流程圖

流程說明:
- TM 通知 TC 開啟全局事務,TC 記錄全局事務狀態;
- TM 通知所有 RM,開始執行分支事務,然后 RM 向 TC 注冊分支事務;
- RM 執行自己的 sql,然后向 TC 報告自己執行的事務狀態;
- TM 通知 TC,提交或回滾全局事務。TM 匯總所有 RM 分支的事務狀態,并通知所有 RM 執行提交或回滾的操作。
可見,AT 模式使用起來更加簡單,無業務侵入,性能更好。因此企業 90% 的分布式事務都可以用 AT 模式來解決。
3.3 TCC 模式
工作流程圖

流程:
- TM 通知 TC 開啟全局事務,TC 記錄全局事務狀態;
- TM 通知 RM 執行分支事務,RM 向 TC 注冊分支事務;
- RM 對將要操作的資源進行檢測和預留,將要執行的資源單獨分出來,并向 TC 匯報所執行的事務狀態;
- TM 通知 TC,提交或回滾全局事務。TC 統計匯總所有 RM 分支事務狀態,并通知所有 RM 執行提交或回滾的操作
- 提交:RM 執行 Congirm 操作,真正執行數據
- 回滾:RM 執行 cancel 操作,將隔離出來的資源返回
TCC 模式的每個階段是做什么的?
- Try:資源檢查和預留
- Confirm:業務執行和提交
- Cancel:預留資源的釋放
3.4 SAGA 模式
工作流程圖

流程:
- TM 通知 TC 開啟全局事務,TC 記錄全局事務;
- TM 通知所有 RM 執行分支事務,RM 向 TC 注冊分支事務;
- RM 執行自己的 sql 業務,并向 TC 匯報分支事務執行的狀態;
- TM 通知 TC 提交或回滾全局事務。TC 匯總所有 RM 的事務狀態,并通知所有 RM 執行提交或回滾
- 提交:RM 執行提交操作
- 回滾:RM 通過回滾機制和補償機制進行回滾操作。
4. 小結
4.1 Seata 是怎么進行分布式事務控制的?
使用 Seata 的 AT 模式,AT 模式的底層使用的是 CAP 的 CP,保證數據的最終一致性。
4.2 Seata 的工作原理?
首先,Seata 是一個專門用于處理分布式事務的開源框架,它通過定義全局事務和分支事務的概念來實現分布式事務的控制,并支持多種模式,如 AT 模式、TCC 模式、SAGA 模式等。
核心概念:
- 事務協調器(TC):維護全局事務和分支事務的狀態,并驅動全局事務的提交或回滾。
- 事務管理器(TM):定義全局事務的邊界,即開始和結束全局事務。
- 資源管理器(RM):管理分支事務并報告分支事務的狀態給 TC,同時也負責分支事務的提交或回滾。
工作原理:
- 開始全局事務:TM 通知 TC 開啟一個全局事務,TC 生成一個全局唯一的 XID 用于標識這個全局事務。
- 執行分支事務:TM 通知 RM 執行分支事務,執行完成后向 TC 報告分支事務的狀態。
- 提交或回滾全局事務:
- 當所有分支事務都成功完成,TM 通知 TC 提交全局事務,TC 隨后指示各個 RM 提交對應的分支事務。
- 如果任何一個分支事務失敗,TM 會通知 TC 回滾全局事務,TC 會指令各 RM 回滾各自的分支事務。
分布式事務模式
- AT 模式:一種無侵入式的分布式事務解決方案,基于數據庫的 ACID 特性,自動完成數據的快照和補償操作,適合對業務代碼侵入性要求較低的場景。
- TCC 模式:需要業務系統提供 Try、Confirm、Cancel 三個方法接口,適用于對一致性要求較高且能夠接受一定程度業務侵入的場景。
- SAGA 模式:長事務解決方案,適用于長時間運行的業務流程,通過一系列子事務及其補償操作來保證最終一致性。
通過上述機制,Seata 實現了對分布式事務的有效管理和控制,也能夠保證事務的一致性和可靠性。