Spring中的事务传播级别

在Spring中,通过使用注解@Transactional可以让方法以事务的方式执行。

什么是事务的传播级别

方法A调用方法B,同时两个方法都用了@Transactional注解来开启事务,那么A、B方法中的事务如何正确工作,就是事务的传播级别。

常见的事务传播级别

Spring中的事务传播级别有7种

  • PROPAGATION_SUPPORTS
  • PROPAGATION_NOT_SUPPORTED
  • PROPAGATION_NEVER
  • PROPAGATION_REQUIRED
  • PROPAGATION_REQUIRES_NEW
  • PROPAGATION_MANDATORY
  • PROPAGATION_NESTED

PROPAGATION_SUPPORTS

支持事务,如果事务不存在,则以非事务的方式运行

PROPAGATION_NOT_SUPPORTED

不支持事务,如果存在事务,则挂起事务

PROPAGATION_NEVER

不支持事务,如果事务存在,则抛出异常

PROPAGATION_REQUIRED

要求存在事务,如果当前不存在事务,则开启一个新的事务,如果事务存在,则在当前事务中运行

PROPAGATION_REQUIRES_NEW

不管事务是否存在,都开启一个新的事务

PROPAGATION_MANDATORY

支持事务,如果事务存在,则加入当前事务,如果事务不存在,则抛出异常

PROPAGATION_NESTED

如果事务存在,则在事务内再嵌套一个事务执行,如果事务不存在,则以PROPAGATION_REQUIRED的方式执行

@Transactional(propagation = PROPAGATION.REQUIRED)
public void methodA() {
    doSomethingPre();
    methodB();
    doSomethingPost();
}

@Transaction(propagation = PROPAGATION.NESTED)
public void methodB() {
    doSomethingPre();
    doSomething();
    doSomethingPost();
}

在以上代码中,如果methodB发生异常,则只有methodB会回滚事务,如果methodA发生异常,methodA和methodB都会回滚事务

@Transactional(propagation = PROPAGATION.REQUIRED)
public void methodA() {
    doSomethingPre();
    methodB();
    doSomethingPost();
}

@Transaction(propagation = PROPAGATION.REQUIRES_NEW)
public void methodB() {
    doSomethingPre();
    doSomething();
    doSomethingPost();
}

在以上代码中,methodB会开启一个全新的事务,不会影响methodA,也不会受methodA影响,即当methodA发生异常,也不会回滚methodB