當前位置:
首頁 > 知識 > try catch對Spring事務的影響

try catch對Spring事務的影響

一、Spring 的默認事務機制,當出現unchecked異常時候回滾,checked異常的時候不會回滾。

異常中unchecked異常包括error和runtime異常。需要try catch或向上拋出的異常,為checked異常比如IOException,也就是說程序拋出runtime異常的時候才會進行回滾,其他異常不回滾,可以配置設置所有異常回滾:

@Transactional(rollbackFor = { Exception.class })

當有try catch後捕獲了異常,事務不會回滾。如果不得不在service層寫try catch 需要catch後 throw new RuntimeException 讓事務回滾。

Spring的AOP即聲明式事務管理,默認是針對unchecked exception回滾。也就是默認對RuntimeException()異常或是其子類進行事務回滾;checked異常,即Exception可try{}捕獲的不會回滾。如果使用try-catch捕獲拋出的unchecked異常後,沒有在catch塊中採用頁面硬編碼的方式使用spring api對事務做顯式的回滾,則事務不會回滾。「將異常捕獲,並且在catch塊中不對事務做顯式提交相當於生吞掉異常」 ,要想捕獲非運行時異常則需要如下配置:

解決辦法:

在針對事務的類中拋出RuntimeException異常,而不是拋出Exception。

在txAdive中增加rollback-for,裡面寫自己的exception,例如自己寫的exception:

或者

定義不回滾的異常

二、Spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(Spring默認取決於是否拋出runtime異常)。

如果拋出runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾。

一般不需要在業務方法中catch異常,如果非要catch,在做完你想做的工作後(比如關閉文件等)一定要拋出runtime exception,否則spring會將你的操作commit,這樣就會產生臟數據。所以你的catch代碼是畫蛇添足。

如:

由此可以推知,在Spring中,如果某個業務方法被整個包裹起來,則這個業務方法也就等於脫離了Spring事務的管理,因為沒有任何異常會從業務方法中拋出!全被捕獲并吞掉,導致Spring異常拋出觸發事務回滾策略失效。不過,如果在catch代碼塊中採用頁面硬編碼的方式使用spring api對事務做顯式的回滾,這樣寫也未嘗不可。

三、基於註解的事務:

Transactional的異常控制,默認是Check Exception 不回滾,unCheck Exception回滾;

如果配置了rollbackFor 和 noRollbackFor 且兩個都是用同樣的異常,那麼遇到該異常,還是回滾;

rollbackFor 和noRollbackFor 配置也許不會含蓋所有異常,對於遺漏的按照Check Exception 不回滾,unCheck Exception回滾。

try catch影響Spring事務嗎?對於這個問題有兩種情況:

1.catch只列印異常,不拋出異常

此方法會影響事務,此時資料庫中訂單數據會插入成功!因為Spring的事務的標準是RuntimeException。

2.catch列印異常,並拋出異常

此方法不會影響事務,因為拋出了RuntimeException。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千鋒JAVA開發學院 的精彩文章:

Hadoop如何將TB級大文件的上傳性能優化上百倍?
Spring分散式事務實現概覽

TAG:千鋒JAVA開發學院 |