Spring 事务失效的几种场景
Posted lisin-lee-cooper
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 事务失效的几种场景的主要内容,如果未能解决你的问题,请参考以下文章
阿里一面:说一说事务注解 @Transactional 失效的几种场景及解决办法