不要涵盖事务中在事务方法中运行的方法



我在某个地方问过这个问题,

假设我有一个方法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((是事务性的(,那么提到的代码肯定会起作用。

最新更新