码迷,mamicode.com
首页 > 编程语言 > 详细

Spring事务

时间:2016-05-26 18:45:15      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

http://my.oschina.net/huangyong/blog/160012?fromerr=rYhBzgPE

记录下Spring事务传播级别

  1. PROPAGATION_REQUIRED
  2. RROPAGATION_REQUIRES_NEW
  3. PROPAGATION_NESTED
  4. PROPAGATION_SUPPORTS
  5. PROPAGATION_NOT_SUPPORTED
  6. PROPAGATION_NEVER
  7. PROPAGATION_MANDATORY

看了 Spring 参考手册之后,更是晕了,这到底是在干嘛?

首先要明确的是,事务是从哪里来?传播到哪里去?答案是,从方法 A 传播到方法 B。Spring 解决的只是方法之间的事务传播,那情况就多了,比如:

  1. 方法 A 有事务,方法 B 也有事务。
  2. 方法 A 有事务,方法 B 没有事务。
  3. 方法 A 没有事务,方法 B 有事务。
  4. 方法 A 没有事务,方法 B 也没有事务。 

这样就是 4 种了,还有 3 种特殊情况。还是用我的 Style 给大家做一个分析吧:

假设事务从方法 A 传播到方法 B,您需要面对方法 B,问自己一个问题:

方法 A 有事务吗?

(这里的意思是:A方法调用B方法)

  1. 如果没有,就新建一个事务;如果有,就加入当前事务。这就是 PROPAGATION_REQUIRED,它也是 Spring 提供的默认事务传播行为,适合绝大多数情况。 
    1.  如果A方法没有事务,则给B方法新建一个事务,A方法无事务执行,B方法有事务执行。
    2.  如果A方法有事务,则B方法加入到A方法的事务中去。
  2. 如果没有,就新建一个事务;如果有,就将当前事务挂起。这就是 RROPAGATION_REQUIRES_NEW,意思就是创建了一个新事务,它和原来的事务没有任何关系了。
    1. 如果A方法没有事务,则给B方法新建一个事务,A方法无事务执行,B方法有事务执行。
    2. 如果A方法有事务,则B方法另起一个事务,跟A方法的事务没有任何关系。
  3. 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。这就是 PROPAGATION_NESTED,也就是传说中的“嵌套事务”了,所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)。
    1. 如果A方法没有事务,则给B方法新建一个事务,A方法无事务执行,B方法有事务执行。
    2. 如果A方法有事务,则出现嵌套事务,如果A方法事务提交或回滚则B方法也提交或回滚。如果B方法回滚,则不影响A方法的事务。
  4. 如果没有,就以非事务方式执行;如果有,就使用当前事务。这就是 PROPAGATION_SUPPORTS,这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正我是支持你的。
    1. 如果A方法没有事务,则B方法以无事务方式执行。
    2. 如果A方法有事务,则B方法就使用A方法的事务。
  5. 如果没有,就以非事务方式执行;如果有,就将当前事务挂起。这就是 PROPAGATION_NOT_SUPPORTED,这种方式非常强硬,没有就没有,有我也不支持你,把你挂起来,不鸟你。
    1. 如果A方法没有事务,则B方法以无事务方式执行。
    2. 如果A方法有事务,则B方法以无事务方式执行,A方法已有事务方式执行。
  6. 如果没有,就以非事务方式执行;如果有,就抛出异常。这就是 PROPAGATION_NEVER,这种方式更猛,没有就没有,有了反而报错,确实够牛的,它说:我从不支持事务!
    1. 如果A方法没有事务,则B方法以无事务方式执行。
    2. 如果A方法有事务,则报错。
  7. 如果没有,就抛出异常;如果有,就使用当前事务。这就是 PROPAGATION_MANDATORY,这种方式可以说是牛逼中的牛逼了,没有事务直接就报错,确实够狠的,它说:我必须要有事务!
    1. 如果A方法没有事务,则报错,表示B方法必须要有事务执行。
    2. 如果A方法有事务,则B方法使用A方法的事务执行。

Spring事务

标签:

原文地址:http://www.cnblogs.com/xjywp2008/p/5531983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!