国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

java事務回滾失敗問題分析

2024-07-13 10:15:52
字體:
來源:轉載
供稿:網友

Spring-Java事物回滾失效處理最近在做項目中,無意間發現有個類在拋事物回滾操作,數據也正常的插入到數據庫當中了,于是仔細查看看一下具體原因。

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

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

最簡單的判斷點有兩個:

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

2.對非檢查型類異常可以不用捕獲,而檢查型異常則必須用try……catch語句塊進行處理或者把異常交給上級方法處理,總之就是必須寫代碼處理它。

Java的異常結構如下圖。其中直接繼承Exception的異常,必須捕獲,屬于檢查型異常。

java回滾事務,java,異常事務回滾,事務回滾,失效

再回過來看我的代碼:

1、方法名前面有

java;">@Transactional 

2、Spring的配置文件applicationContext-XXX.xml當中也有Spring事物的相關配置

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

但是為什么在Service層方法調用的時候,try……catch拋Exception異常已經提交的事物卻沒有回滾?

查看相關spring的文檔后發現,原來spring聲明式事務管理默認對非檢查型異常和運行時異常進行事務回滾,而對檢查型異常則不進行回滾操作。

代碼中try……catch拋出的Exception異常,屬于檢查型異常,Spring的框架默認是不會進行回滾的。

在編程中對非檢查型類異常可以不用捕獲,而檢查型異常則必須用try語句塊進行處理或者把異常交給上級方法處理總之就是必須寫代碼處理它。

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

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

當然我們還有更簡便的方法來解決這個問題,那就是通過注解參數改變默認的回滾方式。

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

使用例:

@Transaction(noRollbackFor=RuntimeException.class)

@Transaction(RollbackFor=Exception.class)

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

啟示:

這就要求我們在自定義異常的時候,讓自定義的異常繼承自RuntimeException,這樣拋出的時候才會被Spring默認的事務處理準確處理。

總結

以上就是本文關于java事務回滾失敗問題分析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青州市| 祁东县| 会泽县| 韶山市| 克什克腾旗| 朝阳市| 伊宁县| 翁牛特旗| 五指山市| 仲巴县| 灵川县| 嘉善县| 辽宁省| 西林县| 龙南县| 仁化县| 会昌县| 江城| 新和县| 金华市| 永登县| 新田县| 鄂伦春自治旗| 卢湾区| 钦州市| 宣化县| 忻城县| 大足县| 海原县| 虎林市| 新蔡县| 碌曲县| 泾阳县| 林周县| 静海县| 建始县| 民和| 九江市| 长丰县| 临泽县| 福清市|