spring事务控制。

spring事务中,方法A中调用了方法b,方法A和方法B是在同一个类中,方法A加了@Transactional注解, 我怎样做才能让方法B不受方法A中的事务控制?

“Devil组”引证GPT后的撰写:

  • 如果想让方法B不受方法A中的事务控制,则可以将方法B移动到另一个类中,或者将方法B标记为不受事务控制。

以下是一些可能的解决方案:

将方法B移动到另一个类中
将方法B移动到另一个类中可以确保它不会受到方法A中的事务控制。您可以在方法B所在的类上使用@Transactional(propagation = Propagation.REQUIRES_NEW)注解来确保该方法始终在自己的事务中运行。这将创建一个新的事务,使得方法B可以独立于方法A运行。

将方法B标记为不受事务控制
如果您不想将方法B移动到另一个类中,您可以使用@Transactional(propagation = Propagation.NOT_SUPPORTED)注解来标记方法B。这将使方法B在没有事务的情况下运行,即使它被调用时正处于方法A中的事务中。

示例代码:

@Service
public class MyService {

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

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void methodB() {
        // ...
    }
}


,methodA()使用了@Transactional注解,而methodB()则使用了@Transactional(propagation = Propagation.NOT_SUPPORTED)注解,这意味着methodB()不会受到methodA()中的事务控制。

可以设置事物的传播属性 propagation(),你这里可以采用如下的第二种【对方法B,添加Transaction注解,设置事物传播属性,新开启事物】或第四种【以非事物方式】,更多的内容查看这里

  1. PROPAGATION_REQUIRED(spring 默认)
    假设外层事务 Service A 的 Method A() 调用 内层Service B 的 Method B()。如果ServiceB.methodB() 的事务级别定义为 PROPAGATION_REQUIRED,那么执行 ServiceA.methodA() 的时候spring已经起了事务,这时调用 ServiceB.methodB(),ServiceB.methodB() 看到自己已经运行在 ServiceA.methodA() 的事务内部,就不再起新的事务。假如 ServiceB.methodB() 运行的时候发现自己没有在事务中,他就会为自己分配一个事务。不管如何,ServiceB.methodB()都会在事务中。

  2. PROPAGATION_REQUIRES_NEW
    比如我们设计 ServiceA.methodA() 的事务级别为 PROPAGATION_REQUIRED,ServiceB.methodB() 的事务级别为 PROPAGATION_REQUIRES_NEW。那么当执行到 ServiceB.methodB() 的时候,ServiceA.methodA() 所在的事务就会挂起,ServiceB.methodB() 会起一个新的事务,等待 ServiceB.methodB() 的事务完成以后,它才继续执行。它与1中的区别在于ServiceB.methodB() 新起了一个事务。如过ServiceA.methodA() 发生异常,ServiceB.methodB() 已经提交的事务是不会回滚的。

  3. PROPAGATION_SUPPORTS
    假设ServiceB.methodB() 的事务级别为 PROPAGATION_SUPPORTS,那么当执行到ServiceB.methodB()时,如果发现ServiceA.methodA()已经开启了一个事务,则加入当前的事务,如果发现ServiceA.methodA()没有开启事务,则自己也不开启事务。这种时候,内部方法的事务性完全依赖于最外层的事务。

  4. NOT_SUPPORTED
    以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

您可以将方法B提取到另一个类中,并在该类中声明一个没有 @Transactional 注解的新方法。然后在方法A中调用新方法而不是方法B。这样,方法B就不会受到方法A的事务控制了。