您的位置:首页 > 编程语言 > Java开发

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

2017-04-15 15:08 686 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring java 事务