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