@Transactional使用try->catch捕獲異常並回滾方法


需求:需要捕獲到@Transactional中的異常,並不影響事物回滾

@Transactional(rollbackFor = Exception.class)
public void test() {  
     try {  
        updata();  
        updata2();  
     } catch (Exception e) {  
          e.printStackTrace();     
          TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//如果updata2()拋了異常,updata()會回滾,不影響事物正常執行                                                                              
     }  

spring 的默認事務機制,當出現unchecked異常時候回滾,checked異常的時候不會回滾;

異常中unchecked異常包括error和runtime異常,需要try catch或向上拋出的異常為checked異常比如IOException,也就是說程序拋出runtime異常的時候才會進行回滾,其他異常不回滾,可以配置設置所有異常回滾: 

@Transactional(rollbackFor = { Exception.class }) 

當有try catch后捕獲了異常,事務不會回滾,如果不得不在service層寫try catch 需要catch后 throw new RuntimeException 讓事務回滾; 

Spring的AOP即聲明式事務管理默認是針對unchecked exception回滾。也就是默認對R untimeException()異常或是其子類進行事務回滾;checked異常,即Exception可try{}捕獲的不會回滾,如果使用try-catch捕獲拋出的unchecked異常后沒有在catch塊中采用頁面硬編碼的方式使用spring api對事務做顯式的回滾,則事務不會回滾, “將異常捕獲,並且在catch塊中不對事務做顯式提交=生吞掉異常” ,要想捕獲非運行時異常則需要如下配置


免責聲明!

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



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