Spring Don';t覆盖事务中在事务方法内部运行的方法

Spring Don';t覆盖事务中在事务方法内部运行的方法,spring,transactions,spring-transactions,Spring,Transactions,Spring Transactions,我在什么地方问过这个问题 假设我有一个使用@transactional在transaction中运行的方法a, 如果存在从该事务方法调用的方法B,默认情况下,该方法也将在同一事务中运行 因此,问题是如何处理B不在交易范围内的情况, 如何避免B的事务。您必须使用以下模式来获得您想要的:执行A,如果B需要A的结果,您可以将其发送到非事务上下文中 void myFunction() { Object result = myTransactionalClass.A();

我在什么地方问过这个问题

假设我有一个使用@transactional在transaction中运行的方法a, 如果存在从该事务方法调用的方法B,默认情况下,该方法也将在同一事务中运行

因此,问题是如何处理B不在交易范围内的情况,
如何避免B的事务。

您必须使用以下模式来获得您想要的:执行A,如果B需要A的结果,您可以将其发送到非事务上下文中

void myFunction() {
        Object result = myTransactionalClass.A();
        B(result);
}

请注意,既然您在问这个问题(您不希望B()是事务性的),那么所提到的代码肯定会起作用。

根据两个方法在同一个类中的注释(自调用),下面的代码可能会起作用

 @Service
public class TestService {

    @Autowired // Self autowiring
    TestService service;

    @Transactional
    public void methodA() {
        service.methodB();
    }

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void methodB() {
        //...
    }
}
服务.methodA()
的外部调用将初始化事务,对
服务.methodB()
的自调用将导致
methodB()
也成为同一事务的一部分,即使它被注释为不参与事务。 为了解决这个问题,我们进行了自我自动连接,并在该实例上调用
methodB()
。这将导致执行
methodB()
的事务配置

以下是自动布线的原因:

在代理模式(默认)下,只有外部方法调用 通过代理进入被拦截。这意味着 自调用(实际上是目标对象中的一个方法调用 目标对象的另一种方法)不会导致实际的 即使调用的方法标记为 @事务性的

参考:

以非事务性方式执行,如果需要,则暂停当前事务 存在。类似于同名的EJB事务属性

请仔细阅读共享文档,了解此传播行为的限制。
希望这有帮助

方法A和方法B属于同一类?或者是另一个Springbean的一部分,比如说service.a()调用repository.B()?是的,它在同一个类中。是的,这可能是一种方法。我想可能有什么东西阻止你这么做。。从那个人问这个问题的方式来看。是的,我想这就是我要找的,如果我把这个放进去会发生什么(propagation=propagation.NOT_SUPPORTED'如果methodB上没有自动连接,spring txn management要检测应用于某个方法的txn行为,对该方法的调用应该通过代理。当我们直接从另一个方法调用该方法时,不涉及代理。要更好地理解这一点,请通读