Seata 多路服務調用時事務不回滾解決辦法

最近使用了Seata作爲分佈式事務管理工具,在一般情況如: A服務調用B服務且A服務調用C服務,即A-B & A-C這種服務調用鏈路,當其中任意一個服務報錯,事務是可以回滾的。

然而,稍微複雜一點的情況我發現seata事務居然不會回滾了!即A-B  & B-C & B-D,這種調用鏈路,seata就不會回滾了,我想說框架都快1.0版本了居然連這種情況都不支持嗎?於是我查了查官方文檔,嗯,除了一些基本的介紹幾乎等於什麼都沒寫,最後我找到了關於微服務的文檔說明,原來是通過綁定一個ID來綁定各個服務的事務,因此解決方法如下:

RootContext.bind(entity.getXid());

在服務鏈路的每個服務接口中都加上綁定XID的代碼,必須保證這些服務綁定的都是同一個XID,XID在開啓全局事務時會自動生成,因此在A服務這樣獲取:

xid = GlobalTransactionContext.getCurrentOrCreate().getXid();

然後在後面的B、C、D服務都綁上這個XID就可以正常回滾事務了,希望後續更新會修復這個問題,如有不正確之處還請指正。

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