案例
update product set name = ‘GTS’ where name = ‘TXC’;
一階段(準備)
- 解析業務SQL,得到 SQL的類型(UPDATE),表(product),條件(where name = ‘TXC’)等相關的信息
- 查詢前鏡像,根據解析得到的條件信息,生成查詢語句(select id, name, since from product where name = ‘TXC’),定位數據,得到前鏡像
- 執行業務SQL,更新這條記錄的name爲 ‘GTS’
- 查詢後鏡像,根據前鏡像的結果,通過主鍵定位數據(select id, name, since from product where id = 1),得到後鏡像
- 插入回滾日誌,把前後鏡像數據以及業務SQL相關的信息組成一條回滾日誌記錄,插入到UNDO_LOG表中
- 向TC註冊分支,申請product表中主鍵值等於 1 的記錄的全局鎖
- 本地事務提交,業務數據的更新和前面步驟中生成的UNDO LOG一併提交
- 將本地事務提交的結果上報給 TC。
二階段(提交)
- 收到 TC 的分支提交請求,把請求放入一個異步任務的隊列中,馬上返回提交成功的結果給 TC
- 異步任務階段的分支提交請求將異步和批量地刪除相應 UNDO LOG 記錄
二階段(回滾)
- 收到TC的分支回滾請求,開啓一個本地事務,執行如下操作
- 通過XID和Branch ID查找到相應的UNDO LOG記錄
- 數據校驗,拿UNDO LOG中的後鏡像與當前數據進行比較,如果有不同,說明數據被當前全局事務之外的動作做了修改。這種情況,需要根據配置策略來做處理
- 根據UNDO LOG中的前鏡像和業務SQL的相關信息生成並執行回滾的語句(update product set name = ‘TXC’ where id = 1)
- 提交本地事務,並把本地事務的執行結果(即分支事務回滾的結果)上報給 TC