Spring 事务传播属性以及PROPAGATION_NESTED 和PROPAGATION_REQUIRES_NEW

来源:互联网 发布:淘宝能买到正规发票吗 编辑:程序博客网 时间:2024/05/16 11:40

spring的六种事务传播属性

PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。


前六个策略类似于EJB CMT,第七个(PROPAGATION_NESTED)是Spring所提供的一个特殊


PROPAGATION_NESTED 和PROPAGATION_REQUIRES_NEW 区别

   1. 开启事务的多少,PROPAGATION_REQUIRES_NEW会开启一个新事务,外部事务挂起,里面的事务独立执行。PROPAGATION_NESTED为父子事务,实际上是借助jdbc的savepoint实现的,属于同一个事物。 
   2. PROPAGATION_NESTED的回滚可以总结为,子事务回滚到savepoint,父事务可选择性回滚或者不不滚;父事务回滚子事务一定回滚。PROPAGATION_REQUIRES_NEW则是不同事物,嵌套事务之间没有必然联系是否回滚都由自己决定。


我的测试样例及结果

调用过程:

methodA(){

methodB();

}


一、 methodA  PROPAGATION_REQUIRED 

methodB  PROPAGATION_REQUIRES  

1. 若A回滚,B可以成功执行

2. 若B回滚,A catch异常可自行决定是否回滚,可作为分支处理(不推荐)


二、methodA  PROPAGATION_REQUIRED 

methodB  PROPAGATION_NESTED 

1.  若A回滚,一定回滚

2.  若B回滚,A catch异常可自行决定是否回滚,可作为分支处理(不推荐)


参考文档 http://blog.csdn.net/jjavaboy/article/details/45243565

0 0