spring下Hibernate的@transactional回滾機制
剛回顧完異常!現在繼續來看下spring下@transactional回滾機制!
1.使用@transactional(不加引數)
@Transactional註解式的事務,預設是Check Exception(Exception.class)不回滾,
unCheck Exception(runtimeException.class)回滾。
原因我覺得是因為check exception我們會catch並且處理掉,而uncheck exception一般不會catch,因此預設只有uncheck exception會回滾。
當我們catch 了uncheck exception時,會發現出現了uncheck exception也不會回滾了。這是因為spring覺得,你自己已經意識到並且catch了這個異常,那你自己處理吧。我不回滾了!!
測試1:首先取得Thing表id=1的行,進行修改。然後再取id=6(實際表中沒有)的行,進行get屬性操作。
結果:表中資料沒變化,丟擲了nullpoint異常(屬於runtime異常),事務回滾。
測試2:用catch抓住異常,並且不處理
結果:資料庫更新了。事務沒有回滾
測試3:catch住異常後,再丟擲一個runtime異常
結果:事務回滾了,表中資料沒變化。
結論:那麼在正常的工作中,如果一個方法可能會丟擲Check Exception,而我們catch了以後也沒法處理,這時,我們可以catch完後throws一個runtime exception。這樣,事務就會回滾了!也就是說一旦出現這個check exception。事務就回滾,這樣不會對資料庫造成影響。
2)使用@transactional(加引數)
還可以再後面預設加上rollbackFor 和 noRollbackFor引數。指定對那些異常型別進行回滾。
rollbackfor+異常型別:出現這個異常就回滾。
noRollbackFor+異常型別:出現這個異常就不回滾
而引數後面沒有涉及到的異常,則按照第一類預設的方法處理。