我在某个地方问过这个问题,
假设我有一个方法a,它通过使用@transactional在transaction中运行,如果有一个方法B正在从该事务性方法调用,那么默认情况下,它也将在同一事务中运行。
所以,问题是,如果B不在交易范围内,该怎么办,如何避免B.的交易
基于这两个方法在同一个类中的注释(自调用(,以下代码可以工作。
@Service
public class TestService {
@Autowired // Self autowiring
TestService service;
@Transactional
public void methodA() {
service.methodB();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
//...
}
}
对service.methodA()
的外部调用将初始化事务,而对service.methodB()
的自调用将导致methodB()
也是同一事务的一部分,即使它被注释为不参与事务。为了解决这个问题,我们在该实例上进行自自动布线并调用methodB()
。这将导致methodB()
的事务配置得到遵守。
以下是自动布线的原因,记录
在代理模式(默认模式(下,只有外部方法调用通过代理进入被拦截。这意味着自调用(实际上是目标对象中的一个方法调用目标对象的另一种方法(不会导致实际即使调用的方法标记为@交易性。
引用:Propagation.NOT_SUPPORTED
以非事务方式执行,如果有存在。类似于同名的EJB事务属性。
请仔细阅读共享的文档,了解此传播行为的限制。希望这能帮助
您必须使用以下模式来获得您想要的:执行A,如果B需要A的结果,您可以将其发送到非事务上下文中。
void myFunction() {
Object result = myTransactionalClass.A();
B(result);
}
请注意,既然你在问这个问题(你不希望B((是事务性的(,那么提到的代码肯定会起作用。