溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java分布式事務(wù)怎么理解

發(fā)布時(shí)間:2022-01-05 17:17:35 來(lái)源:億速云 閱讀:138 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“Java分布式事務(wù)怎么理解”,在日常操作中,相信很多人在Java分布式事務(wù)怎么理解問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java分布式事務(wù)怎么理解”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

事務(wù)就是一個(gè)會(huì)話過(guò)程中,對(duì)上下文的影響是一致的,要么所有的更改都做了,要么所有的更變都撤銷(xiāo)掉。就要么生,要么死。沒(méi)有半死不死的中間不可預(yù)期狀態(tài)。

參考下薛定諤的貓。

事務(wù)是為了保障業(yè)務(wù)數(shù)據(jù)的完整性和準(zhǔn)確性的。

分布式事務(wù),常見(jiàn)的兩個(gè)處理辦法就是兩段式提交和補(bǔ)償。
兩段式提交典型的就是XA,有個(gè)事務(wù)協(xié)調(diào)器,告訴大家,來(lái)都準(zhǔn)備好提交,大家回復(fù),都準(zhǔn)備好了,然后協(xié)調(diào)器告訴大家,一起提交,大家都提交了。
補(bǔ)償比較好理解,先處理業(yè)務(wù),然后定時(shí)或者回調(diào)里,檢查狀態(tài)是不是一致的,如果不一致采用某個(gè)策略,強(qiáng)制狀態(tài)到某個(gè)結(jié)束狀態(tài)(一般是失敗狀態(tài)),然后就世界太平了。典型的就是沖正操作。

準(zhǔn)備好了以后,如果沒(méi)有問(wèn)題,收到提交,所有人都開(kāi)始提交。
這個(gè)時(shí)候,比如對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō),有redo日志的。
如果某個(gè)數(shù)據(jù)庫(kù)這時(shí)候宕機(jī)了,那么它重啟的時(shí)候,先執(zhí)行檢查,也會(huì)把上一次的這些操作都提交掉的。所以各個(gè)點(diǎn)的數(shù)據(jù)都是一致的。

問(wèn)題 1:比如 一個(gè)業(yè)務(wù)要調(diào)用很多的服務(wù)都是寫(xiě)操作,如果有其中一個(gè)寫(xiě)的服務(wù)失敗了,怎么辦 ?假設(shè) 4個(gè)寫(xiě)的吧,有2個(gè)寫(xiě)失敗了 。

kimmking:淘寶之類(lèi)的網(wǎng)站一般的做法是,如果4個(gè)都成功才算成功,那么這次提交時(shí)4個(gè)寫(xiě)都設(shè)置成一個(gè)中間狀態(tài),先容許不一致。然后4個(gè)執(zhí)行完成了以后,回調(diào)或是定時(shí)任務(wù)里檢查這4個(gè)數(shù)據(jù)是不是一致的,如果一致就全部置為成功狀態(tài),如果不一致就全部置為失敗。

復(fù)雜的業(yè)務(wù)交互過(guò)程中,不建議使用強(qiáng)一致性的分布式事務(wù)。解決分布式事務(wù)的最好辦法就是不考慮分布式事務(wù)。就像剛說(shuō)的問(wèn)題一樣,把分布式的事務(wù)過(guò)程拆解成多個(gè)中間狀態(tài),中間狀態(tài)的東西不允許用戶(hù)直接操作,等狀態(tài)都一致成功,或者檢測(cè)到不一致的時(shí)候全部失敗掉。就解耦了這個(gè)強(qiáng)一致性的過(guò)程。

一般情況下準(zhǔn)實(shí)時(shí)就成了。涉及到錢(qián),有時(shí)候也可以這么搞。
淘寶幾s內(nèi)完整一個(gè)訂單處理,不是什么問(wèn)題吧。
銀行也不是全部都強(qiáng)一致性。也會(huì)扎差,也會(huì)沖正。

特別是涉及到多個(gè)系統(tǒng)的時(shí)候,我們比如買(mǎi)機(jī)票,支付完成以后,只支付完成狀態(tài),然后返回給用戶(hù)了,我們過(guò)幾分鐘再刷新頁(yè)面,才會(huì)看到變成已出票,訂單完成狀態(tài)。
這個(gè)時(shí)候,如果我們要求所有處理,都是強(qiáng)一致性的,那么久完蛋了。頁(yè)面要死在那兒幾分鐘,才把這個(gè)事務(wù)處理完成,返回給用戶(hù)。

這樣就肯定涉及一個(gè)問(wèn)題,支付了,但是最終出票沒(méi)出來(lái)。那就沒(méi)辦法,商量換票或退款。
淘寶的訂單改成出票失敗,給支付發(fā)消息通知退款。

慢的時(shí)候,有可能是手工出票,這時(shí)出一張票半小時(shí)都可能,如果要求都必須強(qiáng)一致性的話,所有處理線程都掛在哪兒,系統(tǒng)早就完蛋了。

解決分布式事務(wù)的最好辦法就是不考慮分布式事務(wù)。

拆分,大的業(yè)務(wù)流程,轉(zhuǎn)化成幾個(gè)小的業(yè)務(wù)流程,然后考慮最終一致性。

問(wèn)題2:分布式事務(wù)是你們自己開(kāi)發(fā)的,還是數(shù)據(jù)庫(kù)自帶的?

kimmking:

1、只要一個(gè)處理邏輯能保證要么成功,要么跟什么也沒(méi)做一樣,都算是事務(wù)。數(shù)據(jù)庫(kù)事務(wù),MQ也有事務(wù)。
你自己甚至可以寫(xiě)個(gè)程序生成兩個(gè)文件,要么都生成了,要么都刪掉不留痕跡,這也算是事務(wù)。
2、分布式事務(wù)這一塊有個(gè)XA規(guī)范,實(shí)現(xiàn)XA接口的事務(wù),都可以加入到一個(gè)分布式事務(wù)中,被XA容器管理起來(lái)。

3、補(bǔ)償?shù)霓k法,需要具體情況具體分析,沒(méi)有一個(gè)各種場(chǎng)合都適用的框架。

到此,關(guān)于“Java分布式事務(wù)怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI