一文讀懂分布式事務的解決方案
在?一文讀懂分布式事務原理?中介紹了二階段提交與三階段提交,今天我們來聊聊市面上一些分布式的解決方案。
1.基于MQ的方案
RocketMQ是支持事務消息的,可以直接使用。但是像RabbitMQ其他中間件不支持,可以采用以下的辦法:消息發(fā)送方與接收方,各建一張消息處理表A與B
消息發(fā)送方事務
1.執(zhí)行業(yè)務邏輯1
2.表A添加一條待處理狀態(tài)消息。
消息接收方事務
1.表B添加一條消息記錄
2.執(zhí)行業(yè)務邏輯2
3.異步回調修改A表對應消息狀態(tài)為已處理
定時任務
定時回查表A待處理的消息,去接收方查詢表B查詢對應關系的消息數(shù)據(jù),會有如下兩種情況
1.表B能查到消息,代表業(yè)務邏輯2執(zhí)行成功,只需要修改表A的狀態(tài)
2.表B查詢不到數(shù)據(jù),代表接收方可能處理失敗了。重新發(fā)送消息走一遍邏輯。

2.LCN框架
由事務的參與方(TxClient)與事務協(xié)調者(TxManager)兩部分組成。如下圖事務發(fā)起方、參與方A、參與方B都會向事務協(xié)調者申請各自的groupId,最后加入到同一個事務組進行管理。

lcn的使用
1.一個獨立的工程啟用TxManager
2.需要使用lcn的工程 方法上加 @LcnTransaction注解,配置文件指明TxManger的地址。
lcn缺點
可能造成死鎖、性能較差
3.Seata框架使用
由阿里巴巴開發(fā),基于數(shù)據(jù)庫的,分布式事務框架。
如何使用:
1.每個業(yè)務庫新建UNDO_LOG 表
2.需要使用分布式事務的方法加上 @GlobalTransactional注解
3.在方法執(zhí)行時,UNDO_LOG會生成每個本地事務的回滾語句,如果所有的事務都執(zhí)行成功就會刪除UNDO_LOG 表的數(shù)據(jù)。如果失敗會使用回滾語句進行回滾。
