seata支持的事務模式:AT、TCC、SAGA、XA
AT模式
seata的AT模式必須有sql事務支持
seata-at事務流程圖
在有數據庫參與的情況下,TM、RM都有sql事務的支持,注意:
1.在第3步釋放資源
2.在第5步提交的時候:直接刪除回滾日誌
seata-at事務的本地鎖和全局鎖
寫隔離:避免了髒寫
讀隔離:select ... for update
TCC模式
seata-tcc事務流程圖
轉賬餘額變動問題
使用seata-tcc事務模型在轉賬和收賬過程中可能使餘額不停地變動,兩者相互影響
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