一文讲解Spring中事务的传播机制
什么是Spring中的是事务传播机制呢?
-
事务的传播机制定义了方法在被另一个事务方法调用时的事务行为,这些行为定义了事务的边界和事务上下文如何在方法调用链中传播。
-
Spring 的默认传播行为是 PROPAGATION_REQUIRED,即如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
-
事务传播机制是使用ThreadLocal实现的,所以,如果调用的方法是在新线程中,事务传播会失效
@Transactional public void parentMethod() { new Thread(() -> childMethod()).start(); } public void childMethod() { // 这里的操作将不会在 parentMethod 的事务范围内执行 }
Spring 默认的事务传播行为是 PROPAFATION_REQUIRED,即如果多个
ServiceX#methodX()
都工作在事务环境下,且程序中存在这样的调用链Service1#method1()->Service2#method2()->Service3#method3()
,那么这 3 个服务类的 3 个方法都通过 Spring 的事务传播机制工作在同一个事务中。
protected和private加事务会生效吗?
-
在 Spring 中,只有通过 Spring 容器的 AOP 代理调用的公开方法(public method)上的
@Transactional
注解才会生效。 -
如果在 protected、private 方法上使用
@Transactional
,这些事务注解将不会生效,原因:Spring 默认使用基于 JDK 的动态代理(当接口存在时)或基于 CGLIB 的代理(当只有类时)来实现事务。这两种代理机制都只能代理公开的方法。