Spring事务的传播级别(propagation)

@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. REQUIRED_NEW 无论如何都新建一个事务,与其他事务间互不影响。(始终独立成事务,自成自闭)
若嵌套执行的方法要求各自事务独立,互不影响,则选择本传播级别。

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

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

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

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

6. NOT_SUPPORTED 当前方法不应该有事务,如果有事务存在,将它挂起,以无事务状态运行 (可被吞并,始终不支持事务。)
(无事务,就是指底层的Connection对象的autoCommit、isolation等属性与数据库有关,与dataSource设置的属性有关,不会被Spring改变。)
若嵌套执行的方法要求内部嵌套方法不会对外部方法事务造成影响并且内部方法不需要事务,单独执行时候亦以非事务方式执行,则选择该事物传播级别。

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

原文地址:https://www.cnblogs.com/shijianchuzhenzhi/p/13235825.html