分布式事務解決方案:基于XA協議的兩階段提交、消息事務+最終一致性、TCC編程模式
1、XA協議兩階段提交
分布式事務協議兩部分:(1)事務管理器(負責本地資源提交和回滾)??(2)本地資源管理器(DB實現了XA接口)。
缺點:性能不理想,無法滿足高并發。mysql的XA實現,沒有記錄prepare階段日志,主備切換回不一致。許多nosql也沒支持XA
2、消息事務+最終一致性
基于消息中間件的兩階段提交,將本地事務和發消息放一個分布式事務,本地成功且對外發消息成功,要么都失敗,RocketMQ支持
1、A系統向消息中間件發送預備消息
2、消息中間件保存預備消息并返回成功
3、A執行本地事務
4、A發送提交消息給消息中間件
步驟一、二出錯,整個事務失敗,不會執行A的本地操作
三出錯,回滾預備消息,怎么回滾?A系統實現消息中間件回調接口,消息中間件不斷執行回調接口,檢查A是否成功,失敗則回滾預備消息
四出錯,A事務成功,通過回調接口,中間件檢查A成功,不需要發消息,消息中間件提交消息,完成事務
兩階段提交用在高并發,拆成消息事務(A系統本地操作+發消息)+B本地操作,B系統操作由消息驅動,消息事務成功,A一定成功,B會收到消息執行本地操作,失敗消息會重投,直到成功
3、TCC編程模式
兩階段變種,代碼人為實現兩階段。Try、Confirm和Cancel。下單:Try扣庫存,Confirm更新訂單狀態,失敗,Cancel恢復庫存。
總結
部分控制:變種的兩階段提交,消息事務+最終一致性、TCC模式。并發量和性能很好,一致性減弱
完全控制:完全實現兩階段提交。犧牲性能,保障一致