spring事務什么時候會自動回滾


在java中異常的基類為Throwable,他有兩個子類xception與Errors。同時RuntimeException就是Exception的子類,只有RuntimeException才會進行回滾;

1,Spring事務回滾機制是這樣的:當所攔截的方法有指定異常拋出,事務才會自動進行回滾!

      我們需要注意的地方有四點: 如果你在開發當中引入Spring進行事務管理,但是事務沒能正常的自動回滾,可以對照下面四點,缺一不可!

         ①被攔截方法-—— 注解式:方法或者方法所在類被@Transactional注解;

         ②異常—— 該方法的執行過程必須出現異常,這樣事務管理器才能被觸發,並對此做出處理;

        ③指定異常——  默認配置下,事務只會對Error與RuntimeException及其子類這些UNChecked異常,做出回滾。 一般的Exception這些Checked異常不會發生回滾(如果一般Exception想回滾要做出配置);

                    舉例:實現一般異常的回滾:

                     注解式:

      

@Transactional(rollbackFor=Exception.class)  

@RequestMapping("consump")  

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{    



 }

  

         ④異常拋出—— 即方法中出現的指定異常,只有在被事務管理器捕捉到以后,事務才會據此進行事務回滾;

                       1,不捕捉,會回滾:

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{                   

      int a=consumpDao.insert(s);  

     int b=customerDao.update(customer);       

}  

  

                       2,如果異常被try{}捕捉到,那么事務管理器就無法再捕捉異常,所以就無法做出反應,事務不回滾;

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{  

   try{  

   

      }catch(RuntimeException){  

      }                      

}       

                                    

                        3,如果異常被try{}捕捉了,我們還可以在Catch(){}中throw   new  RuntimeException(),手動拋出運行時異常供事務管理器捕捉;       

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{  

     try{    

 

       }catch(){  

         throw new RuntimeException();  

        }                      

}  

 

2,在實際開發中,有時並沒有異常發生,但是由於事務結果未滿足具體業務需求,所以我們不得不手動回滾事務!

        有如下兩種方法:

                    ①手動拋出異常(如果你沒有配置一般異常事務回滾,請拋出運行時異常)  

    if(){   

    }else{     

        throw new RuntimeException();  

    }                 

 

                    ②編程式實現手動回滾
    if(){ 

   }else{       

      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  

    }  

  

 

轉自:https://my.oschina.net/gaomq/blog/1580290?email=Xie.Chaoyue@outlook.com


免責聲明!

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



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