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范围扩大至代理方法调用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)