Spring事务失效的原因(转载)
特殊说明:转载博主内容,此处仅作学习整理记录
1、没有被 Spring 管理 。
//@Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { //update order } }
把 @Service
注掉,这个类就不会被加载成 Bean,这个类就不会被 Spring 管理了,事务自然就失效了。
2、方法不是 public 的(?)
@Transactional
只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ
代理模式。 spring的声明式事务是基于代理模式的。由于java继承时, 不能重写 private , final , static 修饰的方法。private 方法, final 方法 和 static 方法都没有事务支持。原因,pring的声明式事务是基于代理模式的。 所以, 所有的 private 方法, final 方法 和 static 方法 都无法 直接 添加spring的事务管理功能。
private 方法无法添加事务管理. final 方法无法添加事务管理. static 方法无法添加事务管理. 当绕过代理对象, 直接调用添加事务管理的方法时, 事务管理将无法生效.?
3、异常被吃自定义捕获或异常类型不对
@Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { try { } catch { } } }
4、自身(this)调用问题(疑惑点)
@Service public class TestService { /** * 这里调用methodB() 的事务将会失效 */ public void methodA(){ this.methodB(); } @Transactional public void methodB(){ } }