spring自己抛出异常,居然不能回滚

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring自己抛出异常,居然不能回滚相关的知识,希望对你有一定的参考价值。

spring自己抛出异常,居然不能回滚 大家有遇到这个情况没
在代码中加入 trycatch()模块就不能回滚 不加try的时候可以实现回滚,查了资料说spring 只支持runtimeException的异常才回滚 大家都是怎么解决的
关键字都用了 比如save 执行save方法 捕获异常 无法实现 事务回滚

我理解的是,由于你使用trycatch()将抛出的异常捕获了,所以不会回滚,Spring只有在抛出异常才能回滚,你把异常捕获了,当然不会回滚了 参考技术A spring的事务管理是要有关键字的吧。。比如说find*这样的事务才会进行回滚,用一个不支持的关键字事务是不会回滚的。。

Spring 事务失效的几种场景

1.抛出检查异常导致事务不能正确回滚

spring 默认只会回滚非检查异常,
需要配置rollbackFor属性指定回滚

2.业务方法内自己try-cache异常导致事务不能正确回滚

事务通知只有捕获到目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决:cache中原样抛出异常
或者cache代码块中执行 TransactionInterceptor.currentTransactionStatus().setRollbackOnly();

3.日志Aop切面 中捕获了service中的异常

设置日志切面优先级大于事务切面

4.事务方法没有使用public方法修饰

改为public
或者修改注解方法 将方法为public设置为false

5.父子容器导致的事务失效

子容器扫描范围过大,把未加事务配置的service扫描进来
解决:web扫controller,spring 扫service ,因为sping中的service才加入 了声明式事务

springboot中只有一个容器,不会有这个问题,以前springmvc整合spring时有父子容器存在这个问题。

6.调用本类方法导致传播行为失效

本类方法调用不经过代理,因此无法增强
解决:依赖注入自己代理来调用
通过AopContext拿到代理对象来调用
通过CTW,LTW实现功能增强

7.Transactional 方法导致的synchronized失效

synchronized保证的仅是目标方法的原子性,环绕目标方法的还有commit等操作,它们并未处于sync块内
解决:synchronized范围扩大至代理方法调用

以上是关于spring自己抛出异常,居然不能回滚的主要内容,如果未能解决你的问题,请参考以下文章

Spring 事务失效的几种场景

spring事物回滚机制 (事务异常回滚,捕获异常不抛出就不会回滚)

(转)spring异常抛出触发事务回滚策略

spring配置了事务,抛出异常不回滚

Spring事务异常回滚,捕获异常不抛出就不会回滚

Spring事务异常回滚,捕获异常不抛出就不会回滚