@Transactional事務回滾包含try-catch的區別


1. 不使用try-catch

查詢結果:由於第二條插入語句報錯,所以進行了事務回滾。

2. 使用try-catch

  2. 1. 有try-catch,沒有throw異常


查詢結果:通過數據庫查詢結果發現第一條數據插入成功,第二條失敗!事務沒有進行回滾

  2. 2. 有try-catch 並throw拋出異常


查詢結果:由於第二條插入語句報錯,雖然catch,但是在catch中throw拋出了異常,所以進行了事務回滾。

3. 第2種情況:有try-catch,指定事務的回滾類型,如@Transactional(rollbackFor = Exception.class)

通過數據庫查詢結果發現第一條數據插入成功,第二條失敗!事務沒有進行回滾。
注意:@Transactional只能對runtime異常進行回滾。如@Transactional(rollbackFor = Exception.class)只是對所有異常進行回滾,包括非runtime異常。如果catch后沒有拋出異常,@Transactional並不會進行事務回滾

結論:

  1. @Transactional會對runtime異常進行自動回滾(異常沒有被catch掉)
  2. 如果try-catch,要想進行事務回滾,則throw拋出個異常,事務則會執行。否則事務將不會進行回滾
  3. @Transactional(rollbackFor = Exception.class),可以指定回滾異常,異常會對拋出指定異常時做事務回滾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM