Service中事务不能回滚的解决方式(转)

Posted guoDaXia的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Service中事务不能回滚的解决方式(转)相关的知识,希望对你有一定的参考价值。

1、在service方法里面如果对异常进行了捕获的话,该事务是不会进行回滚的 
       默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。   
       spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过配置来捕获特定的异常并回滚,换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚 
  解决方案:  
  方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在controller层要继续捕获这个异常并处理 

  方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)

 

在service中try。。。catch,在catch块中抛出runtimeException无法实现回滚,不知道为什么。

现在的解决时方案2.或者controller回滚。

以上是关于Service中事务不能回滚的解决方式(转)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL表类型MyISAM/InnoDB的区别(解决事务不回滚的问题)(转)

ROLLBACK语句只能针对未提交的事务进行回滚操作,已提交的事务是不能回滚的?

springboot事务回滚的几种方式

Spring管理事务默认回滚的异常

对mysql事务提交回滚的错误理解

Java事务不回滚的原因总结