Spring的事务传播机制详解

在Spring中,事务传播机制(Transaction Propagation) 定义了事务方法如何与现有的事务进行交互。

REQUIRED

描述

如果当前存在事务,则加入事务;如果当前没有事务,则创建一个新的事务。

应用场景

这是最常用的传播机制,适用于大多数业务逻辑。

例如:一个服务方法调用另一个服务方法时,希望这两个方法共享同一个事务。

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

REQUIRES_NEW

描述

总是创建一个新的事务,如果当前存在事务,则将其挂起

应用场景

适用于需要独立于外部事务的操作。

例如:在主业务逻辑中记录日志或审计信息,这些操作不受主事务回滚的影响

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logAction() {
    // 独立的日志记录逻辑
}

SUPPORTS

描述

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方法执行。

应用场景

适用于既可以在事务上下文中执行,也可以在非事务上下文中执行的操作。

例如:缓存读取操作

@Transactional(propagation = Propagation.SUPPORTS)
public void readCache() {
    // 缓存读取逻辑
}

NOT_SUPPORTED

描述

总是以非事务方式执行,如果当前存在事务,则将其挂起。

应用场景

适用于不需要或不希望在事务上下文中执行的操作。

例如,性能敏感的读操作。

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void fetchData() {
    // 非事务性的数据获取逻辑
}

MANDATORY

描述

必须在现有事务中执行,如果当前没有事务,则抛出异常。

应用场景

适用于必须在现有事务中执行的操作。

例如,某个方法只能作为另一个带有事务的方法的一部分来调用。

@Transactional(propagation = Propagation.MANDATORY)
public void updateRecord() {
    // 必须在现有事务中的更新操作
}

NEVER

描述

必须在非事务环境中执行,如果当前存在事务,则抛出异常。

应用场景

用于明确要求不能在事务上下文中执行的操作。

例如,不允许某些操作参与到任何数据库交易中

@Transactional(propagation = Propagation.NEVER)
public void performNonTransactionalOperation() {
    // 非交易性操作逻辑
}

NESTED

描述

如果当前存在一个活动的事务,则创建一个嵌套的子事务来运行;如果没有活动的事务,则行为类似于 REQUIRED

应用场景

适用于需要嵌套子交易并且希望子交易可以独立回滚而不影响父交易的情况。

例如,在父交易中的某个步骤失败时,只回滚该步骤而不是整个父交易。

@Transactional(propagation = Propagation.NESTED)
public void nestedOperation() {
    // 嵌套子交易逻辑
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值