↓ 跳过正文
  1. 后端开发/

Spring事务传播机制

·2 分钟·
目录

在Spring框架中,事务传播机制(Transaction Propagation)定义了当一个事务方法被另一个事务方法调用时,事务应该如何传播和处理。Spring提供了多种传播行为,以满足不同的业务需求。以下是Spring中常用的事务传播机制:

PROPAGATION_REQUIRED(默认行为)
#

  • 如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。
  • 适用于大多数场景。
  • 示例:
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
    methodB(); // 调用另一个事务方法
}

PROPAGATION_SUPPORTS
#

  • 如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。
  • 适用于可选的事务场景。
  • 示例:
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // 业务逻辑
}

PROPAGATION_MANDATORY
#

  • 如果当前存在事务,则加入该事务;如果没有事务,则抛出异常。
  • 适用于必须在事务中执行的场景。
  • 示例:
@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {
    // 业务逻辑
}

PROPAGATION_REQUIRES_NEW
#

  • 创建一个新的事务,如果当前存在事务,则将其挂起。
  • 适用于需要独立事务的场景。
  • 示例:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {
    // 业务逻辑
}

PROPAGATION_NOT_SUPPORTED
#

  • 以非事务方式执行,如果当前存在事务,则将其挂起。
  • 适用于不需要事务的场景。
  • 示例:
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {
    // 业务逻辑
}

PROPAGATION_NEVER
#

  • 以非事务方式执行,如果当前存在事务,则抛出异常。
  • 适用于绝对不允许事务的场景。
  • 示例:
@Transactional(propagation = Propagation.NEVER)
public void methodF() {
    // 业务逻辑
}

PROPAGATION_NESTED
#

  • 如果当前存在事务,则在嵌套事务中执行;如果没有事务,则创建一个新的事务。
  • 适用于需要嵌套事务的场景。
  • 示例:
@Transactional(propagation = Propagation.NESTED)
public void methodG() {
    // 业务逻辑
}

理解和正确使用Spring的事务传播机制,可以帮助开发者更好地管理事务,确保数据的一致性和完整性。根据具体的业务需求选择合适的传播行为,是实现高效事务管理的关键。

叶知秋
作者
叶知秋
写后端的,日常和 Java、Go、数据库、消息队列打交道,也折腾网络和自托管。这里记录实践中搞明白的东西。