spring事务的传播机制
1.require(默认)
作用:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。
场景:大多数业务方法都使用此传播行为。
解释:如果 methodA 调用 methodB,则 methodB 会加入 methodA 的事务。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
methodB();
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// 业务逻辑
}
2.requires_new
作用:无论当前是否存在事务,都创建一个新事务。如果当前存在事务,则挂起当前事务。
场景:需要独立事务的方法,例如日志记录。
解释:如果 methodA 调用 methodB,则 methodB 会启动一个新事务,methodA 的事务会被挂起。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
methodB(); // methodB 会启动一个新事务
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// 业务逻辑
}
3.supports
作用:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
场景:方法可以支持事务,但不强制要求事务
解释:如果 methodA 调用 methodB,则 methodB 会加入 methodA 的事务;如果 methodB 被单独调用,则以非事务方式执行。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
methodB(); // methodB 会加入 methodA 的事务
}
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// 业务逻辑
}
4.not_supported
作用:以非事务方式执行操作。如果当前存在事务,则挂起当前事务。
场景:不需要事务支持的方法。
解释:如果 methodA 调用 methodB,则 methodB 会以非事务方式执行,methodA 的事务会被挂起。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
methodB(); // methodB 会以非事务方式执行
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
// 业务逻辑
}
5.mandatory(强制的)
作用:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
场景:强制要求调用方必须有事务。
解释:如果 methodA 调用 methodB,则 methodB 会加入 methodA 的事务;如果 methodB 被单独调用且没有事务,则会抛出异常。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
methodB(); // methodB 会加入 methodA 的事务
}
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
// 业务逻辑
}
6.never
作用:以非事务方式执行操作。如果当前存在事务,则抛出异常。
场景:强制要求调用方不能有事务
解释:如果 methodA 调用 methodB,且 methodA 没有事务,则 methodB 会以非事务方式执行;如果 methodA 有事务,则会抛出异常
public void methodA() {
// 业务逻辑
methodB(); // methodB 会以非事务方式执行
}
@Transactional(propagation = Propagation.NEVER)
public void methodB() {
// 业务逻辑
}
7.nested(嵌套)
作用:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务
场景:需要部分回滚的场景。
解释:如果 methodA 调用 methodB,则 methodB 会在 methodA 的事务中创建一个嵌套事务。如果 methodB 回滚,则只会回滚 methodB 的操作,而不会影响 methodA 的事务。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
methodB(); // methodB 会在嵌套事务中执行
}
@Transactional(propagation = Propagation.NESTED)
public void methodB() {
// 业务逻辑
}