javascript
关于Spring 声明式事务处理时,throws exception不回滚的问题
文章轉(zhuǎn)自:http://cn-done.iteye.com/blog/775519
前一段時(shí)間,項(xiàng)目代碼評(píng)審,發(fā)現(xiàn)有TX不使用Spring的事務(wù)處理,而直接封裝方法,手動(dòng)進(jìn)行數(shù)據(jù)的回滾,得悉原因是:拋出異常以后事務(wù)不起作 用,沒(méi)有回滾。這理由頓時(shí)讓人很無(wú)語(yǔ),不過(guò)還算個(gè)聰明的TX,知曉另辟蹊徑,但是在insert的時(shí)候,手動(dòng)回滾直接delete就可以了,如果是 update,不曉得還會(huì)有什么更犀利的辦法。
????? 仔細(xì)評(píng)審代碼細(xì)節(jié),發(fā)現(xiàn)該TX壓根沒(méi)有按照框架原先設(shè)計(jì)在service層throws BusinessException,而是直接throws Exception。Spring配置異常回滾采用的是rollback-for=“BusinessException”。TX提出疑問(wèn):Spring 不是拋出異常事務(wù)就會(huì)回滾么?帶著疑問(wèn),查閱資料,分析源代碼,最終找到想要的答案。這一切來(lái)源于java的檢查性異常、非檢查性異常的區(qū)別。
????? 使用spring難免要用到spring的事務(wù)管理,要用事務(wù)管理又會(huì)很自然的選擇聲明式的事務(wù)管理,在spring的文檔中說(shuō)道,spring聲明式事務(wù)管理默認(rèn)對(duì)非檢查型異常和運(yùn)行時(shí)異常進(jìn)行事務(wù)回滾,而對(duì)檢查型異常則不進(jìn)行回滾操作。
那么什么是檢查型異常什么又是非檢查型異常呢?
最簡(jiǎn)單的判斷點(diǎn)有兩個(gè):
1.繼承自runtimeexception或error的是非檢查型異常,而繼承自exception的則是檢查型異常(當(dāng)然,runtimeexception本身也是exception的子類(lèi))。
2.對(duì)非檢查型類(lèi)異常可以不用捕獲,而檢查型異常則必須用try語(yǔ)句塊進(jìn)行處理或者把異常交給上級(jí)方法處理總之就是必須寫(xiě)代碼處理它。所以必須在service捕獲異常,然后再次拋出,這樣事務(wù)方才起效。
參考文章:http://blog.csdn.net/ilovejava_2010/article/details/7861749
轉(zhuǎn)載于:https://my.oschina.net/liangzhenghui/blog/179917
總結(jié)
以上是生活随笔為你收集整理的关于Spring 声明式事务处理时,throws exception不回滚的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL innosetup_jdk,
- 下一篇: 电商系统_如何打造 一个完美的电商系统