Spring事务的传播行为

Spring事务的传播行为指的是一个事务方法调用另一个事务方法时,事务如何传播的行为。Spring框架提供了7种事务传播行为,分别是REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。

1.REQUIRED

如果当前A没有事务,则执行B创建一个新事务。如果当前A存在事务,则B加入A的事务中。这是默认的传播行为。

示例代码:

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
    // 业务逻辑
    method2(); // 调用method2方法
}

@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
    // 业务逻辑
}

在method1方法中调用method2方法时,如果method2方法没有事务,则会加入method1方法的事务中。

2.SUPPORTS

如果当前有事务,则加入该事务中。如果当前没有事务,则以非事务方式执行。

示例代码:

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
    // 业务逻辑
    method2(); // 调用method2方法
}

@Transactional(propagation = Propagation.SUPPORTS)
public void method2() {
    // 业务逻辑
}

在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会加入method1方法的事务中。如果method1方法没有事务,则method2方法会以非事务方式执行。

3.MANDATORY

如果当前有事务,则加入该事务中。如果当前没有事务,则抛出异常。

示例代码:

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
    // 业务逻辑
    method2(); // 调用method2方法
}

@Transactional(propagation = Propagation.MANDATORY)
public void method2() {
    // 业务逻辑
}

在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会加入method1方法的事务中。如果method1方法没有事务,则会抛出异常。

4.REQUIRES_NEW

如果当前有事务,则挂起该事务,并创建一个新事务。如果当前没有事务,则创建一个新事务。

示例代码:

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
    // 业务逻辑
    method2(); // 调用method2方法
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method2() {
    // 业务逻辑
}

在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会挂起method1方法的事务,并创建一个新事务。如果method1方法没有事务,则method2方法会创建一个新事务。

5.NOT_SUPPORTED

以非事务方式执行。如果当前存在事务,则挂起该事务。

示例代码:

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
    // 业务逻辑
    method2(); // 调用method2方法
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void method2() {
    // 业务逻辑
}

在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会以非事务方式执行。如果method1方法没有事务,则method2方法也会以非事务方式执行。

6.NEVER

以非事务方式执行。如果当前存在事务,则抛出异常。

示例代码:

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
    // 业务逻辑
    method2(); // 调用method2方法
}

@Transactional(propagation = Propagation.NEVER)
public void method2() {
    // 业务逻辑
}

在method1方法中调用method2方法时,如果method1方法有事务,则会抛出异常。如果method1方法没有事务,则method2方法会以非事务方式执行。

7.NESTED

如果当前有事务,则在该事务中嵌套一个新事务,如果当前没有事务,则创建一个新事务。

示例代码:

@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
    // 业务逻辑
    method2(); // 调用method2方法
}

@Transactional(propagation = Propagation.NESTED)
public void method2() {
    // 业务逻辑
}

在method1方法中调用method2方法时,如果method1方法有事务,则在该事务中嵌套一个新事务。如果method1方法没有事务,则method2方法会创建一个新事务。method1 回滚,method2事务跟着一起回滚。

method2可以单独回滚,前提method2是处理了异常。

06-11 22:40