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 事务失效的几种场景的主要内容,如果未能解决你的问题,请参考以下文章

Spring 事务失效的几种场景

Spring 事务失效的几种场景

面试官:你知道哪些事务失效的场景?

阿里一面:说一说事务注解 @Transactional 失效的几种场景及解决办法

阿里一面:说一说事务注解 @Transactional 失效的几种场景及解决办法

「Spring」事务失效的场景