Spring 事务传播机制包含以下 7 种:
- Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果
当前没有事务,则创建一个新的事务。
- Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的
方式继续运行。
- Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加入该事务;如果当
前没有事务,则抛出异常。
- Propagation.REQUIRES_NEW:表示创建一个新的事务,如果当前存在事务,则把当前事务挂
起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如
果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。
以上 7 种传播行为,可以根据是否支持当前事务分为以下 3 类:
类一:支持当前事务
REQUIRED(需要有)
如果当前方法没有事务,新建一个事务,如果已经存在一个事务中,则加入这个事务中。
【类比情侣关系:有房子就一起住,没房子一起赚钱买房子。(愿意陪你吃苦的,但一定要有房子)】
SUPPORTS(可以有)
支持当前事务,如果当前没有事务,就以非事务方式执行。
【有房子一起住,没房子租房住(有的住,没房子也无所谓)】
MANDATORY(强制有)
使用当前的事务,如果当前没有事务,就抛出异常。
【有房子一起住,没房子分手(不要陪你吃苦,没房子就分手)】
类二:不支持当前事务
REQUIRES_NEW
新建事务执行,如果当前存在事务,把当前事务挂起。
【不要你的房子,咱们必须一起赚钱买房子。(不住你的房子,必须买新房子)】
NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
【不要你的房子,咱们必须一起租房子(不住你的房子,必须租房子)】
NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
【必须一起租房子,你要有房子就分手(必须一起租房子,你有房子就分手—看不上你的房子,还得陪你还房贷)】
类三:嵌套事务
NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
【有房子咱们以房子维根据地做点小买卖,赚钱了很好继续发展,赔钱了至少还有房子。如果没房子也没关系,一起赚钱买房子(无风险创业,保本懂事型情侣)】
【注:这里的“房子”指的就是事务】
嵌套事务(NESTED)和加入事务(REQUIRED)的区别:
整个事务如果全部执行成功,二者的结果是一样的。
如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部回滚,不会影
响上一个方法中执行的结果。
版权归原作者 xiaofu深藏blue 所有, 如有侵权,请联系我们删除。