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