Spring事务的传播级别

Posted 不受人言驱使,不失己言风范。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务的传播级别相关的知识,希望对你有一定的参考价值。

@Transactional(propagation=PROPAGATION_REQUIRED)
pubilc void methodA(){
        doPreSomething;
        methodB();
        doSufSomething;
}

@Transactional(propagation=PROPAGATION_REQUIRED)
@Transactional(propagation=PROPAGATION_REQUIRED_NEW)
@Transactional(propagation=PROPAGATION_SUPPORTS)
@Transactional(propagation=PROPAGATION_NOT_SUPPORTED)
@Transactional(propagation=PROPAGATION_MANDATORY)
@Transactional(propagation=PROPAGATION_NEVER)
@Transactional(propagation=PROPAGATION_NESTED)
pubilc void methodB(){
        doSomething;
} 

1. PROPAGATION_REQUIRED_NEW 无论如何都新建一个事务,与其他事务间互不影响。(始终独立成事务)
若嵌套执行的方法要求各自事务独立,互不影响,则选择本传播级别。

2. PROPAGATION_REQUIRED(默认) 可单独成一事务。若被其他事务包裹则加入该事务,成为其一部分。(平等加入,独立亦可成事务)
若嵌套执行的方法要求一起成功或者回滚,则选择本传播级别。

3. PROPAGATION_SUPPORTS 单独不能成事务,只能依赖其他事务,成为其事务的一部分。(依赖加入,独立不能成事务)
若嵌套执行的方法要求一起成功或者回滚,单独执行时候以非事务方式执行,则选择本事物级别。

4. PROPAGATION_MANDATORY 只能成为其他事务的一部分,单纯执行将报错。(强制加入,独立不可执行。)
若嵌套执行的方法要求一起执行成功或者一起回滚,不允许以不被事务包裹方式执行,则选择该事物传播级别。

5. PROPAGATION_NESTED 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行。(巢筑,独立亦可成事务)
若嵌套执行的方法要求内部方法出错只回滚自己,外部方法执行失败回滚所有,单独执行时候自动开启一个执行,则选择该事物传播级别。

6. PROPAGATION_NOT_SUPPORTED 被事务包裹则挂起执行,不影响事务,单独执行时候亦以非事务方式执行。(可被吞并,始终不支持事务。)
若嵌套执行的方法要求内部嵌套方法不会对外部方法事务造成影响并且内部方法不需要事务,单独执行时候亦以非事务方式执行,则选择该事物传播级别。

7. PROPAGATION_NEVER 被事务强制包裹则抛出异常,单独执行时候必须以非事务方式执行。(不可被吞并,始终不支持事务。)
若嵌套执行的方法要求内部方法不允许在事务中执行,单独执行时候必须以非事务方式执行,则选择该事物传播级别。

以上是关于Spring事务的传播级别的主要内容,如果未能解决你的问题,请参考以下文章

spring 事务的传播级别和隔离级别

理解Spring的事务传播级别

浅析Spring事务传播行为和隔离级别

Spring事务隔离级别和传播特性

spring事务传播性与隔离级别

Spring事务的传播特性和隔离级别