Seata(分佈式事務解決方案) AT模式工作機制

案例

update product set name = ‘GTS’ where name = ‘TXC’;

一階段(準備)

  1. 解析業務SQL,得到 SQL的類型(UPDATE),表(product),條件(where name = ‘TXC’)等相關的信息
  2. 查詢前鏡像,根據解析得到的條件信息,生成查詢語句(select id, name, since from product where name = ‘TXC’),定位數據,得到前鏡像
  3. 執行業務SQL,更新這條記錄的name爲 ‘GTS’
  4. 查詢後鏡像,根據前鏡像的結果,通過主鍵定位數據(select id, name, since from product where id = 1),得到後鏡像
  5. 插入回滾日誌,把前後鏡像數據以及業務SQL相關的信息組成一條回滾日誌記錄,插入到UNDO_LOG表中
  6. 向TC註冊分支,申請product表中主鍵值等於 1 的記錄的全局鎖
  7. 本地事務提交,業務數據的更新和前面步驟中生成的UNDO LOG一併提交
  8. 將本地事務提交的結果上報給 TC。

二階段(提交)

  1. 收到 TC 的分支提交請求,把請求放入一個異步任務的隊列中,馬上返回提交成功的結果給 TC
  2. 異步任務階段的分支提交請求將異步和批量地刪除相應 UNDO LOG 記錄

二階段(回滾)

  1. 收到TC的分支回滾請求,開啓一個本地事務,執行如下操作
  2. 通過XID和Branch ID查找到相應的UNDO LOG記錄
  3. 數據校驗,拿UNDO LOG中的後鏡像與當前數據進行比較,如果有不同,說明數據被當前全局事務之外的動作做了修改。這種情況,需要根據配置策略來做處理
  4. 根據UNDO LOG中的前鏡像和業務SQL的相關信息生成並執行回滾的語句(update product set name = ‘TXC’ where id = 1)
  5. 提交本地事務,並把本地事務的執行結果(即分支事務回滾的結果)上報給 TC

鏈接

Seata:http://seata.io/zh-cn/docs/dev/mode/at-mode.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章