码迷,mamicode.com
首页 > 编程语言 > 详细

spring 使用事务注解@Transactional 异常捕获事务失效的问题

时间:2020-03-14 14:29:59      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:失效   异常   spring   回滚   检查   等于   llb   cep   处理   

 

在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。

什么是检查型异常和什么是非检查型异常?

1:非检查型异常

     继承自RuntimeException(也是Exception的子类)或error的是非检查型异常

  非检查型类异常可以不用捕获

2:检查型异常

       继承自Exception的则是检查型异常

  而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理

 

spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚

 

在实际业务中 如果我们把业务方法放到一个catch中,这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉,导致spring异常抛出触发事务回滚策略失效。

这样的话,我们需要在catch 里面 手动去回滚 加上 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 这段就OK了

    try {   

           method1();

   method2();

          } catch(Exception e) {   

             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

   }

spring 使用事务注解@Transactional 异常捕获事务失效的问题

标签:失效   异常   spring   回滚   检查   等于   llb   cep   处理   

原文地址:https://www.cnblogs.com/lmtdb/p/12492004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!