首页 > 技术文章 > @Transactional使用try->catch捕获异常并回滚方法

zhangmingcheng 2020-03-18 11:24 原文

需求:需要捕获到@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块中不对事务做显式提交=生吞掉异常” ,要想捕获非运行时异常则需要如下配置

推荐阅读