seata原理

seata支持的事務模式:AT、TCC、SAGA、XA

AT模式

seata的AT模式必須有sql事務支持

seata-at事務流程圖

25-seata-at事務流程圖.jpg
在有數據庫參與的情況下,TM、RM都有sql事務的支持,注意:
1.在第3步釋放資源
2.在第5步提交的時候:直接刪除回滾日誌

seata-at事務的本地鎖和全局鎖

25-seata-at事務的本地鎖和全局鎖.jpg

寫隔離:避免了髒寫

讀隔離:select ... for update

TCC模式

seata-tcc事務流程圖

26-seata-tcc事務流程圖.jpg

轉賬餘額變動問題

使用seata-tcc事務模型在轉賬和收賬過程中可能使餘額不停地變動,兩者相互影響

26-seata-tcc轉賬餘額異常解決.jpg

seata-tcc事務模型可能產生的三種問題

空回滾

空回滾:try未執行sql操作,cancel執行,try不會再次執行

解決方案:加事務控制表

{

​ tx_id(全局事務id)

​ branch_id(分支事務id)

​ 狀態(1.事務初始化 2.已提交 3.已回滾)

}

answer:執行cancel時檢查狀態是否爲1(事務初始化),是-正常執行cancel,否-執行個空cancel

冪等

冪等:多次執行cancel,confirm

解決方案:加事務控制表

{

​ tx_id(全局事務id)

​ branch_id(分支事務id)

​ 狀態(1.事務初始化 2.已提交 3.已回滾)

}

answer:執行cancel,confirm前檢查狀態是否已變更,是-拋異常或者執行空操作,否-正常執行cancel,confirm

懸掛

懸掛:cancel在try之前,try操作超時了並且會再次執行

解決方案:加事務控制表

{

​ tx_id(全局事務id)

​ branch_id(分支事務id)

​ 狀態(1.事務初始化 2.已提交 3.已回滾)

}

answer:cancel的時候,新增一條記錄(如果原來沒有記錄,執行空方法,再插入已回滾的狀態。)這樣再次執行try操作時,發現有記錄,執行空try

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