Spring 事务失效的几种场景

Spring 事务失效的几种场景,第1张

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范围扩大至代理方法调用

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/904977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-15
下一篇 2022-05-15

发表评论

登录后才能评论

评论列表(0条)

保存