8 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
多個(gè)線程好解決,樓主想問的是不同進(jìn)程怎么同步事務(wù)吧,比如多個(gè)dubbo服務(wù)。
確實(shí)有這個(gè)問題,首先有這樣的技術(shù),可以強(qiáng)一致,但效率犧牲太多,很少有公司這么干;大多數(shù)做法都是:服務(wù)A提交后,在某個(gè)東西(比如zookeeper)上記錄節(jié)點(diǎn);服務(wù)B提交后,記錄另一個(gè)節(jié)點(diǎn)(這些節(jié)點(diǎn)都在表示本次事務(wù)的樹枝節(jié)點(diǎn)下)……后續(xù)有個(gè)監(jiān)聽器類的東西,檢查樹枝節(jié)點(diǎn)下的節(jié)點(diǎn)數(shù)、狀態(tài)等,如果有問題分別回滾或重試或人工干預(yù)等等……

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
數(shù)據(jù)庫事務(wù)多線程比較麻煩,因?yàn)椋?/p>
- 這會(huì)占用大量數(shù)據(jù)庫連接;
- 不能用線程池,因?yàn)榫€程運(yùn)行到最后必須等待協(xié)調(diào),要么回滾要么提交。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
在主方法new 一個(gè)InheritableThreadLocal 并設(shè)值為true,線程中如果出錯(cuò)則把值改為false。線程全部執(zhí)行完之后,判斷InheritableThreadLocal 的值,如果為false,你就手動(dòng)拋出異常聲明式回滾,或者自己寫手動(dòng)回滾。這樣應(yīng)該可以達(dá)到你的要求吧

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
CountDownLatch
加上一個(gè)封裝 transaction 和 state 的 queue 每個(gè)線程執(zhí)行時(shí),去隊(duì)列中拿一個(gè)事務(wù),執(zhí)行完finally 扔回去并 count() , 并設(shè)置state = true;
最后在主線程判斷所有transaction 的state 都是true ,然后就全部提交
添加回答
舉報(bào)