文章目录
在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() {
// 嵌套子交易逻辑
}