Seata
2019年1月份螞蟻金服和阿里巴巴共同開源的分佈式事務解決方案。
Simple Extensible Autonomous Transaction Architecture,簡單可擴展自治事務框架。
TC/TM/RM三大組件:
執行流程:
- TM開啓分佈式事務(TM向TC註冊全局事務記錄)
- 按業務場景,編排數據庫、服務等事務中資源(RM向TC彙報資源準備狀態)
- TM結束分佈式事務,事務一階段結束(TM通知TC提交/回滾分佈式事務)
- TC彙總事務信息,決定分佈式事務是提交還是回滾
- TC通知所有RM提交/回滾資源,事務二階段結束
默認使用AT模式:
整體機制
兩階段提交協議的演變:
-
一階段:業務數據和回滾日誌記錄在同一個本地事務中提交,釋放本地鎖和連接資源。
-
二階段:
- 提交異步化,非常快速地完成。
- 回滾通過一階段的回滾日誌進行反向補償
一階段加載:
在一階段,Seata會攔截『業務SQL』
- 解析SQL語義,找到『業務SQL』要更新的業務數據,在業務數據被更新前,將其保存成"before image"
- 執行『業務SQL』更新業務數據,在業務數據更新之後
- 其保存成"after image",最後生成行鎖
以上操作全部在一個數據庫事務內完成,這樣保證了一階段操作的原子性。
二階段提交:
二階段如是順利提交的話,因爲『業務SQL』在一階段已經提交到數據庫,所以Seata框架只需將一階段快照數據和行鎖刪掉,完成數據清理即可。
二階段回滾:
二階段如果是回滾的話,Seata就需要回滾一階段已經執行的『業務SQL』,還原數據。
回滾的方式便是用"before image"還原業務數據;但在還原前首先要校驗髒寫
,對比"數據庫當前業務數據"和"after image",如果兩份數據完全一致就說明沒有髒寫,可以還原業務數據,如果不一致就說明有髒寫,出現髒寫就需要轉人工處理。