溫馨提示×

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

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

java事務(wù)回滾失敗怎么辦

發(fā)布時(shí)間:2021-07-13 10:30:47 來源:億速云 閱讀:146 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下java事務(wù)回滾失敗怎么辦,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

Spring-Java事物回滾失效處理最近在做項(xiàng)目中,無(wú)意間發(fā)現(xiàn)有個(gè)類在拋事物回滾操作,數(shù)據(jù)也正常的插入到數(shù)據(jù)庫(kù)當(dāng)中了,于是仔細(xì)查看看一下具體原因。

一切還是要從Java的檢查型異常和非檢查型異常說起。

那么什么是檢查型異常什么又是非檢查型異常呢?

最簡(jiǎn)單的判斷點(diǎn)有兩個(gè):

1.繼承自RuntimeException或Error的是非檢查型異常,而繼承自Exception的則是檢查型異常(當(dāng)然,RuntimeException本身也是Exception的子類)。

2.對(duì)非檢查型類異??梢圆挥貌东@,而檢查型異常則必須用try……catch語(yǔ)句塊進(jìn)行處理或者把異常交給上級(jí)方法處理,總之就是必須寫代碼處理它。

Java的異常結(jié)構(gòu)如下圖。其中直接繼承Exception的異常,必須捕獲,屬于檢查型異常。

java事務(wù)回滾失敗怎么辦

再回過來看我的代碼:

1、方法名前面有

@Transactional

2、Spring的配置文件applicationContext-XXX.xml當(dāng)中也有Spring事物的相關(guān)配置

<bean id="transactionManager" 
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
  <property name="dataSource" ref="dataSource" /> 
  <property name="rollbackOnCommitFailure" value="true"></property> 
</bean>

但是為什么在Service層方法調(diào)用的時(shí)候,try……catch拋Exception異常已經(jīng)提交的事物卻沒有回滾?

查看相關(guān)spring的文檔后發(fā)現(xiàn),原來spring聲明式事務(wù)管理默認(rèn)對(duì)非檢查型異常和運(yùn)行時(shí)異常進(jìn)行事務(wù)回滾,而對(duì)檢查型異常則不進(jìn)行回滾操作。

代碼中try……catch拋出的Exception異常,屬于檢查型異常,Spring的框架默認(rèn)是不會(huì)進(jìn)行回滾的。

在編程中對(duì)非檢查型類異??梢圆挥貌东@,而檢查型異常則必須用try語(yǔ)句塊進(jìn)行處理或者把異常交給上級(jí)方法處理總之就是必須寫代碼處理它。

所以必須在service捕獲異常,然后再次手動(dòng)throw一個(gè)非檢查型異常,這樣事務(wù)方才起效。例如:

try{ 
  ………… 
} catch (Exception e) { 
  ………… 
  throw new BusinessException(e.getMessage()); 
}

當(dāng)然我們還有更簡(jiǎn)便的方法來解決這個(gè)問題,那就是通過注解參數(shù)改變默認(rèn)的回滾方式。

在@Transaction注解中定義了noRollbackFor和RollbackFor來指定某種異常是否回滾。

使用例:

@Transaction(noRollbackFor=RuntimeException.class)

@Transaction(RollbackFor=Exception.class)

所以上述的問題可以直接將@Transaction添加回滾參數(shù)@Transaction(RollbackFor=Exception.class),這樣就改變了默認(rèn)的事務(wù)處理方式。

啟示:

這就要求我們?cè)谧远x異常的時(shí)候,讓自定義的異常繼承自RuntimeException,這樣拋出的時(shí)候才會(huì)被Spring默認(rèn)的事務(wù)處理準(zhǔn)確處理。

看完了這篇文章,相信你對(duì)“java事務(wù)回滾失敗怎么辦”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(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