Seata 一部分補充
- Seata
- 再看TC/TM/RM三大元件
- 分布式事務的執行流程
- AT模式
-
- 前提
- 整體機制
-
- 一階段加載
- 二階段送出
- 二階段復原
- 總結
Seata
2019年1月份,螞蟻金服和阿裡巴巴共同開源的分布式事務解決方案
Seata:Simple Extensible Autonomous Transaction Architecture,簡單可擴充自治事務架構
2020起始,參加工作以後用1.0以後的版本。
再看TC/TM/RM三大元件
什麼是TC,TM,RM
TC:seata伺服器
TM:帶有@GlobalTransaction注解的方法
RM:資料庫,也就是事務參與方
分布式事務的執行流程
- TM開啟分布式事務(TM向TC注冊全局事務記錄),相當于注解
注解@GlobelTransaction
- 按業務場景,編排資料庫,服務等事務内部資源(RM向TC彙報資源準備狀态)
- TM結束分布式事務,事務一階段結束(TM通知TC送出、復原分布式事務)
- TC彙總事務資訊,決定分布式事務是送出還是復原
- TC通知所有RM送出、復原資源,事務二階段結束
AT模式
前提
- 基于支援本地ACID事務的關系型資料庫
- Java應用,通過JDBC通路資料庫
整體機制
兩階段送出協定的演變
一階段:業務資料和復原日志記錄在同一個本地事務中送出,釋放本地鎖和連接配接資源
二階段
- 送出異步化,非常快速的完成
- 復原通過一階段的復原日志進行反向補償
一階段加載
在一階段,Seata會攔截 業務SQL
解析SQL語義,找到業務SQL,要更新的業務資料,在業務資料被更新前,将其儲存成
before image(前置鏡像)
執行業務SQL更新業務資料,在業務資料更新之後
将其儲存成 after image,最後生成行鎖
以上操作全部在一個資料庫事務内完成,這樣保證了一階段操作的原子性
二階段送出
二階段如果順利送出的話,因為業務SQL在一階段已經送出至資料庫,是以Seata架構隻需将一階段儲存的快照和行鎖删除掉,完成資料清理即可
二階段復原
二階段如果復原的話,Seata就需要復原到一階段已經執行的 業務SQL,還原業務資料
復原方式便是用 before image 還原業務資料,但是在還原前要首先校驗髒寫,對比資料庫目前業務資料 和after image,如果兩份資料完全一緻,沒有髒寫,可以還原業務資料,如果不一緻說明有髒讀,出現髒讀就需要轉人工處理