GTS 定義了一套事務框架以便描述分布式事務,在框架下支持不同事務模式運行。
核心組件定義
分布式事務包含以下 3 個核心組件:
- Transaction Coordinator(TC):事務協調器,維護全局事務的運行狀態,負責協調并驅動全局事務的提交或回滾。
- Transaction Manager(TM):控制全局事務的邊界,負責開啟一個全局事務,并最終發起全局提交或全局回滾的決議。
- Resource Manager(RM):控制分支事務,負責分支注冊、狀態匯報,并接收事務協調器的指令,驅動分支(本地)事務的提交和回滾。
一個典型的事務過程包括:
- TM 向 TC 申請開啟(Begin)一個全局事務,全局事務創建成功并生成一個全局唯一的 XID。
- XID 在微服務調用鏈路的上下文中傳播。
- RM 向 TC 注冊分支事務,將其納入 XID 對應全局事務的管轄。
- TM 向 TC 發起針對 XID 的全局提交(Commit)或回滾(Rollback)決議。
- TC 調度 XID 下管轄的全部分支事務完成提交(Commit)或回滾(Rollback)請求。
事務框架
基于架構上定義的 3 個核心組件,分布式事務被抽象成如下事務框架。
3個核心組件的功能如下:
- TM定義全局事務的邊界。
- RM負責定義分支事務的邊界和行為。
- TC、TM和RM交互,做全局的協調。交互包括開啟(Begin)、提交(Commit)、回滾(Rollback)全局事務;分支注冊(Register Branch)、狀態上報(Branch Status Report)和分支提交(Branch Commit)、分支回滾(Branch Rollback)。
事務模式
事務模式是這個框架下 RM 驅動的分支事務的不同行為模式,即事務(分支)模式。事務模式包括 AT 模式、TCC 模式、Saga 模式和 XA 模式。
- AT 模式
AT 模式 RM 驅動分支事務的行為分為以下兩個階段:
- 執行階段:
- 代理 JDBC 數據源,解析業務 SQL,生成更新前后的鏡像數據,形成 UNDO LOG。
- 向 TC 注冊分支。
- 分支注冊成功后,把業務數據的更新和 UNDO LOG 放在同一個本地事務中提交。
- 完成階段:
- 全局提交,收到 TC 的分支提交請求,異步刪除相應分支的 UNDO LOG。
- 全局回滾,收到 TC 的分支回滾請求,查詢分支對應的 UNDO LOG 記錄,生成補償回滾的 SQL 語句,執行分支回滾并返回結果給 TC。
- 執行階段:
- TCC 模式
TCC 模式 RM 驅動分支事務的行為分為以下兩個階段:
- 執行階段:
- 向 TC 注冊分支。
- 執行業務定義的 Try 方法。
- 向 TC 上報 Try 方法執行情況:成功或失敗。
- 完成階段:
- 全局提交,收到 TC 的分支提交請求,執行業務定義的 Confirm 方法。
- 全局回滾,收到 TC 的分支回滾請求,執行業務定義的 Cancel 方法。
- 執行階段:
- Saga 模式
Saga 模式 RM 驅動分支事務的行為包含以下兩個階段:
- 執行階段:
- 向 TC 注冊分支。
- 執行業務方法。
- 向 TC 上報業務方法執行情況:成功或失敗。
- 完成階段:
- 全局提交,RM 不需要處理。
- 全局回滾,收到 TC 的分支回滾請求,執行業務定義的補償回滾方法。
- 執行階段:
- XA 模式
XA 模式 RM 驅動分支事務的行為包含以下兩個階段:
- 執行階段:
- 向 TC 注冊分支。
- XA Start,執行業務 SQL,XA End。
- XA prepare,并向 TC 上報 XA 分支的執行情況:成功或失敗。
- 完成階段:
- 收到 TC 的分支提交請求,XA Commit。
- 收到 TC 的分支回滾請求,XA Rollback。
- 執行階段: