事务不生效的场景

1.private、final、static方法,事务不生效,入口方法必须是public ,spring的AOp特性决定的,spring认为private自己用的方法应该自己控制,不应该用事务切进去

2、Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚(至于为什么spring要这么设计:因为spring认为Checked的异常属于业务的,coder需要给出解决方案而不应该直接扔该框架)

3.同类调用不生效(service方法中调用本类中的另一个方法,事务没有生效):

同一个类中一个无事务的方法调用另一个有事务的方法,事务是不会起作用

4.如果使用的是rollbakfor的默认,已检查的异常(所有派生自Error和RuntimeException的类,都是未检查异常.其余的是已检查异常, 比如nullPointException是未检查的,IllegalAccessException 是已检查的)不回滚, 可设为rollbackFor={Exception.class}

5.最好不要把@trasaction注解到接口上:

在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。

6、确认你的类是否被代理了(因为spring的事务实现原理为AOP,只有通过代理对象调用方法才能被拦截,事务才能生效

7、确保你的业务和事务入口在同一个线程里,否则事务也是不生效的

猜你喜欢

转载自www.cnblogs.com/blackdd/p/12481851.html