事务传播行为类型说明
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>