Spring 的事务传播机制?
事务的传播机制定义了方法在被另一个事务方法调用时的事务行为,这些行为定义了事务的边界和事务上下文如何在方法调用链中传播。
三分恶面渣逆袭:6种事务传播机制
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 的代理(当只有类时)来实现事务。这两种代理机制都只能代理公开的方法。