Spring事务的传播特性
Spring事务的传播行为指的是多个事务存在的时候,Spring如何处理
Spring中事务的传播特性有以下7种:
-
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
-
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
-
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
-
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
-
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
-
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
-
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
示例说明
Spring项目里有以下三个方法
通过设置不同的事物传播方式,来观察7种事务传播方式是如何定义的:
@Transactional(propagation = Propagation...)
public boolean add1() {
//添加一个用户
}
@Transactional(propagation = Propagation...)
public boolean add2() {
//添加一个用户
throw new RuntimeException("事务传播性测试");
}
@Transactional
//@Transactional
public String transactionTest() {
boolean result = userService.add1();
boolean result2 = userService.add2();
return "添加一个用户,result: " + result + " result2: " + result2;
}
得出以下结论:
-
REQUIRED:如果外层transactionTest()开启了事务,则add1和add2都加入transactionTest()的事务中,属于同一个事务。否则,add1和add2则都会创建一个自己的事务,属于分开的两个事务
-
SUPPORTS:如果外层transactionTest()开启了事务,则add1和add2都加入transactionTest()的事务中,属于同一个事务。否则,add1和add2都不会创建事务
-
MANDATORY:如果外层transactionTest()没有开启了事务,则会抛出异常。如果有则加入
-
REQUIRES_NEW:不管外层transactionTest()有没有开启事务,add1和add2都创建各自的事务
-
NOT_SUPPORTED:不使用事务,也不会抛出异常
-
NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常
-
NESTED:如果外层transactionTest()开启了事务,则创建一个嵌套事务(内部事务回滚不影响外部事务提交,外部事务回滚会把内部事务回滚)。如果外层没有事务,则新建一个事务