Spring中七种Propagation类的事务属性详解
Spring框架提供了七种事务传播行为(Propagation),它们定义了事务方法在调用其他事务方法时的行为规则。这些传播行为是Spring事务管理的核心概念之一。
1. REQUIRED(默认值)
Propagation.REQUIRED
如果当前存在事务,则加入该事务
如果当前没有事务,则创建一个新的事务
这是最常用的传播行为,也是默认值
适用场景:大多数业务方法都适用,确保操作在一个事务中完成。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
}
2. SUPPORTS
Propagation.SUPPORTS
如果当前存在事务,则加入该事务
如果当前没有事务,则以非事务方式执行
适用场景:查询方法,可以适应有事务或无事务的环境。
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// 查询逻辑
}
3. MANDATORY
Propagation.MANDATORY
如果当前存在事务,则加入该事务
如果当前没有事务,则抛出异常
适用场景:必须在一个已有事务中被调用的方法,否则视为编程错误。
@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {
// 业务逻辑
}
4. REQUIRES_NEW
Propagation.REQUIRES_NEW
创建一个新的事务
如果当前存在事务,则挂起当前事务
适用场景:需要独立事务的操作,如日志记录,不希望受外层事务影响。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {
// 业务逻辑
}
5. NOT_SUPPORTED
Propagation.NOT_SUPPORTED
以非事务方式执行
如果当前存在事务,则挂起当前事务
适用场景:不需要事务支持的操作,如某些性能敏感的非关键操作。
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {
// 业务逻辑
}
6. NEVER
Propagation.NEVER
以非事务方式执行
如果当前存在事务,则抛出异常
适用场景:严格要求不能在事务中执行的方法。
@Transactional(propagation = Propagation.NEVER)
public void methodF() {
// 业务逻辑
}
7. NESTED
Propagation.NESTED
如果当前存在事务,则在嵌套事务内执行
如果当前没有事务,则创建一个新的事务
嵌套事务是外部事务的一部分,只有外部事务提交时,嵌套事务才会提交
嵌套事务可以独立回滚而不影响外部事务
适用场景:需要部分回滚的场景,如批量处理中的单条记录失败不影响其他记录。
@Transactional(propagation = Propagation.NESTED)
public void methodG() {
// 业务逻辑
}
传播行为对比表
传播行为 当前有事务 当前无事务 备注
REQUIRED 加入当前事务 创建新事务 默认值
SUPPORTS 加入当前事务 非事务执行 适合查询
MANDATORY 加入当前事务 抛出异常 强制要求事务
REQUIRES_NEW 挂起当前事务,创建新事务 创建新事务 独立事务
NOT_SUPPORTED 挂起当前事务,非事务执行 非事务执行 不支持事务
NEVER 抛出异常 非事务执行 禁止事务
NESTED 嵌套事务执行 创建新事务 部分回滚能力
实际应用建议
查询方法:使用SUPPORTS或NOT_SUPPORTED,减少不必要的事务开销
核心业务方法:使用REQUIRED,确保数据一致性
日志记录等辅助操作:使用REQUIRES_NEW,避免主业务回滚影响日志记录