spring中的七种事务传播机制

事务传播行为类型说明

PROPAGATION_REQUIRED

<code>如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。/<code>

PROPAGATION_SUPPORTS

<code>支持当前事务,如果当前没有事务,就以非事务方式执行。/<code>

PROPAGATION_MANDATORY

<code>使用当前的事务,如果当前没有事务,就抛出异常。/<code>

PROPAGATION_REQUIRES_NEW

<code>新建事务,如果当前存在事务,把当前事务挂起。/<code>

PROPAGATION_NOT_SUPPORTED

<code>以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。/<code>

PROPAGATION_NEVER

<code>以非事务方式执行,如果当前存在事务,则抛出异常。/<code>

PROPAGATION_NESTED

<code>如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与ROPAGATION_REQUIRED
类似的操作。/<code>

REQUIRED

Propagation.REQUIRED 修饰的内部方法和外围方法用的是一个事务。 只要一个事务回滚,整个事务就会回滚。

SUPPORTS

REQUIRED 和 SUPPORTS在外围方法支持事务的时候没有区别,均加入外围方法的事务中。

<code>// 当外围方法不支持事务,REQUIRED开启新的事务而SUPPORTS不开启事务。 ​
 // REQUIRED的事务一定和外围方法事务统一。如果外围方法没有事务,每一个内部REQUIRED方法都会开启一个新的事务,互不干扰。/<code>

NOT_SUPPORTED

明确表示不开启事务。

REQUIRES_NEW

无论外围方法是否开启事务,内部REQUIRES_NEW方法均会开启独立事务,且和外围方法也不在同一个事务中,内部方法和外围方法、内部方法之间均不相互干扰。

// 当外围方法不开启事务的时候,REQUIRED和REQUIRES_NEW标注的内部方法效果相同。

MANDATORY

只要外围没有事务就会直接抛出异常,具体插入方法都没有机会执行。

外围方法开启事务,内部MANDATORY方法都加入外围方法事务,外围方法抛出异常,事务回滚.。 内部方法抛出异常,事务也会回滚。

NEVER

外围方法开启事务。内部方法执行的时候因外围有事务而直接抛出异常,都没有机会执行。

NESTED

在外围方法未开启事务的情况下Propagation.NESTED 和 Propagation.REQUIRED 作用相同,修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰。

外围方法开启事务,内部事务为外围事务的子事务,内部方法抛出异常回滚,且外围方法感知异常致使整体事务回滚。 但是内部外部方法抛出异常,不会影响到内部方法的执行


在外围方法开启事务的情况下Propagation.NESTED修饰的内部方法属于外部事务的子事务,外围主事务回滚,子事务一定回滚,而内部子事务可以单独回滚而不影响外围主事务和其他子事务


事务的可见性

<code>对于REQUIRES_NEW和NOT_SUPPORTED传播属性,在外围方法开启事务,均不可见外围事务执行结果。
//对于REQUIREED和NESTED传播属性,无论外围方法是否开启事务,均可见外围方法执行结果。  /<code>


重点:

<code>//NESTED和REQUIRED修饰的内部方法都属于外围方法事务,如果外围方法抛出异常,这两种方法的事务都会被回滚。
//但是REQUIRED是加入外围方法事务,所以和外围事务同属于一个事务,所以一旦REQUIRED事务抛出异常被回滚,外围方法事务也将被回滚
//而NESTED是外围方法的子事务,有单独的保存点,所以NESTED方法抛出异常被回滚,不会影响到外围方法的事务。
​
//NESTED和REQUIRES_NEW都可以做到内部方法事务回滚但是不影响外围方法事务。
//但是因为NESTED是嵌套事务,所以外围方法回滚之后,作为外围方法事务的子事务也会被回滚。
//而REQUIRES_NEW是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。/<code> 


分享到:


相關文章: