http://my.oschina.net/huangyong/blog/160012?fromerr=rYhBzgPE
记录下Spring事务传播级别
- PROPAGATION_REQUIRED
- RROPAGATION_REQUIRES_NEW
- PROPAGATION_NESTED
- PROPAGATION_SUPPORTS
- PROPAGATION_NOT_SUPPORTED
- PROPAGATION_NEVER
- PROPAGATION_MANDATORY
看了 Spring 参考手册之后,更是晕了,这到底是在干嘛?
首先要明确的是,事务是从哪里来?传播到哪里去?答案是,从方法 A 传播到方法 B。Spring 解决的只是方法之间的事务传播,那情况就多了,比如:
- 方法 A 有事务,方法 B 也有事务。
- 方法 A 有事务,方法 B 没有事务。
- 方法 A 没有事务,方法 B 有事务。
- 方法 A 没有事务,方法 B 也没有事务。
这样就是 4 种了,还有 3 种特殊情况。还是用我的 Style 给大家做一个分析吧:
假设事务从方法 A 传播到方法 B,您需要面对方法 B,问自己一个问题:
方法 A 有事务吗?
(这里的意思是:A方法调用B方法)
- 如果没有,就新建一个事务;如果有,就加入当前事务。这就是 PROPAGATION_REQUIRED,它也是 Spring 提供的默认事务传播行为,适合绝大多数情况。
- 如果A方法没有事务,则给B方法新建一个事务,A方法无事务执行,B方法有事务执行。
- 如果A方法有事务,则B方法加入到A方法的事务中去。
- 如果没有,就新建一个事务;如果有,就将当前事务挂起。这就是 RROPAGATION_REQUIRES_NEW,意思就是创建了一个新事务,它和原来的事务没有任何关系了。
- 如果A方法没有事务,则给B方法新建一个事务,A方法无事务执行,B方法有事务执行。
- 如果A方法有事务,则B方法另起一个事务,跟A方法的事务没有任何关系。
- 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。这就是 PROPAGATION_NESTED,也就是传说中的“嵌套事务”了,所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)。
- 如果A方法没有事务,则给B方法新建一个事务,A方法无事务执行,B方法有事务执行。
- 如果A方法有事务,则出现嵌套事务,如果A方法事务提交或回滚则B方法也提交或回滚。如果B方法回滚,则不影响A方法的事务。
- 如果没有,就以非事务方式执行;如果有,就使用当前事务。这就是 PROPAGATION_SUPPORTS,这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正我是支持你的。
- 如果A方法没有事务,则B方法以无事务方式执行。
- 如果A方法有事务,则B方法就使用A方法的事务。
- 如果没有,就以非事务方式执行;如果有,就将当前事务挂起。这就是 PROPAGATION_NOT_SUPPORTED,这种方式非常强硬,没有就没有,有我也不支持你,把你挂起来,不鸟你。
- 如果A方法没有事务,则B方法以无事务方式执行。
- 如果A方法有事务,则B方法以无事务方式执行,A方法已有事务方式执行。
- 如果没有,就以非事务方式执行;如果有,就抛出异常。这就是 PROPAGATION_NEVER,这种方式更猛,没有就没有,有了反而报错,确实够牛的,它说:我从不支持事务!
- 如果A方法没有事务,则B方法以无事务方式执行。
- 如果A方法有事务,则报错。
- 如果没有,就抛出异常;如果有,就使用当前事务。这就是 PROPAGATION_MANDATORY,这种方式可以说是牛逼中的牛逼了,没有事务直接就报错,确实够狠的,它说:我必须要有事务!
- 如果A方法没有事务,则报错,表示B方法必须要有事务执行。
- 如果A方法有事务,则B方法使用A方法的事务执行。
Spring事务
原文:http://www.cnblogs.com/xjywp2008/p/5531983.html