1. 程式人生 > >spring下Hibernate的@transactional回滾機制

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+異常型別:出現這個異常就不回滾

而引數後面沒有涉及到的異常,則按照第一類預設的方法處理。