TCC分布式事務(wù)七種異常情況小結(jié)
TCC標(biāo)準(zhǔn)編程模型

異常一:try階段異常
在try階段異常之后,就會(huì)執(zhí)行cancel階段,此時(shí)cancel階段是一定要保證成功的,如果cancel階段沒(méi)有執(zhí)行成功,那么就要進(jìn)行重試
異常二:cancel階段異常
其實(shí)這個(gè)異常的處理方式和異常一是一樣的,失敗了就重試,如果一直重試失敗,那么就要進(jìn)行人工干預(yù)
異常三:confirm提交異常
try階段成功了,那么confirm一定要成功,如果失敗了,那么就要進(jìn)行重試,重試多次還未成功,那么就要進(jìn)行人工干預(yù)
但是這里重試要注意,因?yàn)樵赾onfirm階段有二步數(shù)據(jù)庫(kù)操作,如果扣凍結(jié)張三20元成功了,但是李四加20元失敗了,這時(shí)候重試就要做判斷,看張三扣減20元是否之前已經(jīng)操作成功了,如果操作成功了,就不要再次進(jìn)行扣減凍結(jié)的操作

異常四:本地事務(wù)與TCC事務(wù)沖突
在try階段我們添加了一個(gè)本地事務(wù),如果這時(shí)候try階段異常,那么本地事務(wù)就會(huì)回滾,所以這時(shí)候凍結(jié)張三20元的操作就會(huì)回滾,也就不會(huì)被凍結(jié)。那么這時(shí)候try階段異常了,就會(huì)執(zhí)行cancel階段進(jìn)行回滾
在cancel階段,我們會(huì)還張三凍結(jié)的20元,這時(shí)候如果cancel執(zhí)行成功,那么張三的金額就會(huì)多出20元,就會(huì)造成數(shù)據(jù)的不一致,所以一般不要加本地事務(wù)
@Transaction(rollback=Exception.class)
@Hmily(comfirmMethod="confirmMethod",cancelMethod="cancelMethod")
public void try() {
//查詢(xún)張三余額信息
Account account = accountMapper.selectByUserId(1);
//凍結(jié)張三20元
account.setDJAccount(20);
accountMapper.updateById(account);
}

異常五:空回滾
為什么會(huì)有空回滾的異常呢? 比如我們?cè)趫?zhí)行try階段的時(shí)候,由于超時(shí)了,導(dǎo)致TCC就去執(zhí)行cancel階段了,但是這時(shí)候try階段還沒(méi)有執(zhí)行,也就是try階段還沒(méi)有凍結(jié)張三20元,這時(shí)候就造成了空回滾。
這時(shí)候我們需要引入其它手段,比如增加一張日志表,在回滾的時(shí)候,判斷一下這是事務(wù)有沒(méi)有執(zhí)行try階段,也就是這個(gè)事務(wù)有沒(méi)有執(zhí)行過(guò)try階段,如果沒(méi)有就不要執(zhí)行cancel階段的操作了。

異常六:第二階段重復(fù)提交
第二階段包括confirm,cancel,為什么會(huì)有重復(fù)提交呢? 因?yàn)槲覀儾荒鼙WCconfirm階段或者cancel階段一定能成功,如果不成功那么我們就要進(jìn)行重試,
舉個(gè)例子,在confirm階段有二步數(shù)據(jù)庫(kù)操作,假設(shè)扣減張三凍結(jié)20元成功,但是李四加20元失敗了,這時(shí)候我們就要進(jìn)行重試,但是重試的時(shí)候我們扣減張三凍結(jié)的20元已經(jīng)操作成功了,所以不需要再次扣減了,所以我們要做好類(lèi)似去重的操作,之前操作成功的就不要再次進(jìn)行操作了

異常七:防懸掛
cancel階段比try階段先執(zhí)行,由于網(wǎng)絡(luò)原因?qū)е聇ry階段超時(shí),這時(shí)候就會(huì)執(zhí)行cancel階段操作,等cancel階段執(zhí)行完了,這時(shí)候try才執(zhí)行,雖然事務(wù)失敗了,但是這個(gè)事務(wù)已經(jīng)結(jié)束了,所以這時(shí)候的try方法一定不能執(zhí)行
以上就是TCC分布式事務(wù)七種異常情況小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于TCC分布式事務(wù)異常的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用java API實(shí)現(xiàn)zip遞歸壓縮和解壓文件夾
這篇文章主要介紹了使用java API實(shí)現(xiàn)zip遞歸壓縮文件夾及解壓,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Struts2實(shí)現(xiàn)上傳單個(gè)文件功能
這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)上傳單個(gè)文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
RabbitMQ交換機(jī)與Springboot整合的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了RabbitMQ交換機(jī)與Springboot整合的簡(jiǎn)單實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Mybatis操作Clickhouse數(shù)組的最佳實(shí)踐分享
ClickHouse 的 Array(T) 數(shù)據(jù)類(lèi)型支持任意有效數(shù)據(jù)類(lèi)型作為元素,包括基本類(lèi)型、嵌套數(shù)組和可空類(lèi)型,本文給大家分享了Mybatis操作Clickhouse數(shù)組的最佳實(shí)踐,需要的朋友可以參考下2025-09-09
Java中HTTP GET方法調(diào)用帶有body的問(wèn)題解決
這篇文章主要為大家詳細(xì)介紹了Java如何解決HTTP GET方法調(diào)用帶有body的問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2024-02-02
SpringBoot2.x 集成騰訊云短信的詳細(xì)流程
本文主要對(duì)SpringBoot2.x集成騰訊云短信進(jìn)行簡(jiǎn)單總結(jié),其中SpringBoot使用的2.4.5版本,本文通過(guò)業(yè)務(wù)流程圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06
基礎(chǔ)不牢,地動(dòng)山搖,Java基礎(chǔ)速來(lái)刷刷
基礎(chǔ)不牢,地動(dòng)山搖,快來(lái)一起學(xué)習(xí)一下基礎(chǔ)吧,不斷地學(xué)習(xí)就算是基礎(chǔ)也會(huì)有新的認(rèn)知和收獲,加油2021-08-08

