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並不會進行事務回滾
結論:
- @Transactional會對runtime異常進行自動回滾(異常沒有被catch掉)
- 如果try-catch,要想進行事務回滾,則throw拋出個異常,事務則會執行。否則事務將不會進行回滾
- @Transactional(rollbackFor = Exception.class),可以指定回滾異常,異常會對拋出指定異常時做事務回滾