分布式事務(wù)解決方案:基于XA協(xié)議的兩階段提交、消息事務(wù)+最終一致性、TCC編程模式
1、XA協(xié)議兩階段提交
分布式事務(wù)協(xié)議兩部分:(1)事務(wù)管理器(負責本地資源提交和回滾)??(2)本地資源管理器(DB實現(xiàn)了XA接口)。
缺點:性能不理想,無法滿足高并發(fā)。mysql的XA實現(xiàn),沒有記錄prepare階段日志,主備切換回不一致。許多nosql也沒支持XA

2、消息事務(wù)+最終一致性
基于消息中間件的兩階段提交,將本地事務(wù)和發(fā)消息放一個分布式事務(wù),本地成功且對外發(fā)消息成功,要么都失敗,RocketMQ支持

1、A系統(tǒng)向消息中間件發(fā)送預備消息
2、消息中間件保存預備消息并返回成功
3、A執(zhí)行本地事務(wù)
4、A發(fā)送提交消息給消息中間件
步驟一、二出錯,整個事務(wù)失敗,不會執(zhí)行A的本地操作
三出錯,回滾預備消息,怎么回滾?A系統(tǒng)實現(xiàn)消息中間件回調(diào)接口,消息中間件不斷執(zhí)行回調(diào)接口,檢查A是否成功,失敗則回滾預備消息
四出錯,A事務(wù)成功,通過回調(diào)接口,中間件檢查A成功,不需要發(fā)消息,消息中間件提交消息,完成事務(wù)
兩階段提交用在高并發(fā),拆成消息事務(wù)(A系統(tǒng)本地操作+發(fā)消息)+B本地操作,B系統(tǒng)操作由消息驅(qū)動,消息事務(wù)成功,A一定成功,B會收到消息執(zhí)行本地操作,失敗消息會重投,直到成功

3、TCC編程模式
兩階段變種,代碼人為實現(xiàn)兩階段。Try、Confirm和Cancel。下單:Try扣庫存,Confirm更新訂單狀態(tài),失敗,Cancel恢復庫存。
總結(jié)
部分控制:變種的兩階段提交,消息事務(wù)+最終一致性、TCC模式。并發(fā)量和性能很好,一致性減弱
完全控制:完全實現(xiàn)兩階段提交。犧牲性能,保障一致