spring 事务传播
Spring 中的事务传播(Transaction Propagation)是用来定义一个事务方法(或事务控制边界)在调用另一个事务方法时,如何处理事务的行为规则。换句话说,它决定了事务方法在调用其他事务方法时,是否要加入已存在的事务,创建一个新的事务,或者以非事务方式执行。
在多个事务方法相互调用的场景中,事务传播行为决定了每个方法内部事务的执行方式。Spring 提供了多种事务传播行为,用于满足不同的业务需求和场景。
常见的事务传播行为包括:
- REQUIRED:如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务。
- REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。
- NESTED:在嵌套事务中执行,如果不存在事务,则创建一个新的事务。
- SUPPORTS:如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行。
- NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则将其挂起。
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- MANDATORY:如果当前存在事务,则加入该事务;如果不存在事务,则抛出异常。
Spring Boot提供了TX控制的事务管理器,可以通过@Transactional注解来指定事务的传播行为。事务的传播行为定义了一个方法调用时所在的事务环境,包括事务的启动、提交和回滚等。
Spring Boot定义了7种事务传播行为:
-
REQUIRED:如果当前上下文中存在事务,方法就在该事务中运行,否则就启动一个新的事务;
-
SUPPORTS:如果当前上下文中存在事务,方法就在该事务中运行,否则就以非事务方式运行;
-
MANDATORY:方法必须在一个已存在的事务中运行,否则会抛出异常;
-
REQUIRES_NEW:方法总是启动一个新的事务,如果当前上下文中存在事务,就将其挂起;
-
NOT_SUPPORTED:方法总是以非事务方式运行,如果当前上下文中存在事务,就将其挂起;
-
NEVER:方法必须在非事务环境下运行,如果当前上下文中存在事务,就会抛出异常;
-
NESTED:如果当前上下文中存在事务,则方法就在一个嵌套的事务中运行,否则就与REQUIRED行为一样。
通过注解@Transactional(propagation = Propagation.XXX)来指定事务的传播行为,其中XXX代表了上述的7种传播行为之一。例如:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomething() {
// 业务逻辑
}
这样就指定了doSomething方法的事务传播行为为REQUIRES_NEW,即无论当前是否存在事务,都会启动一个新的事务来执行该方法。