情況一:如果沒有在程序中手動捕獲異常,如下代碼事務會回滾
- @Transactional(rollbackFor = { Exception.class })
- public void test() throws Exception {
- doDbStuff1();
- doDbStuff2();//假如這個操作數據庫的方法會拋出異常,方法doDbStuff1()對數據庫的操作會回滾。
- }
如果doDbStuff2()方法拋出異常,方法doDbStuff1()對數據庫的操作會回滾。
情況二:如果在程序中自已捕獲異常未往外拋,如下代碼事務不會回滾
- @Transactional(rollbackFor = { Exception.class })
- public void test() {
- try {
- doDbStuff1();
- doDbStuff2();//假如這個操作數據庫的方法會拋出異常,現在方法doDbStuff1()對數據庫的操作 不會回滾。
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
如果doDbStuff2()這個操作數據庫的方法拋出異常,因爲將異常捕獲未往外拋,方法doDbStuff1()對數據庫的操作不會回滾。
情況三:如果自己需要捕獲異常又要返回錯誤時,可以參考以下做法
- @Transactional(rollbackFor = { Exception.class })
- public void test() {
- try {
- doDbStuff1();
- doDbStuff2();
- } catch (Exception e) {
- e.printStackTrace();
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是這一句了,加上之後,如果doDbStuff2()拋了異常, //doDbStuff1()是會回滾的
- return “xxx錯誤信息”;
- }
- }