Spring事务中requires_new和嵌套传播之间的差异

时间:2012-09-12 14:49:17

标签: java spring transactions propagation

我无法理解PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED传播政策之间的行为差​​异。在我看来,在这两种情况下,当前进程都是回滚的,而不是整个事务。任何线索?

3 个答案:

答案 0 :(得分:90)

请看这个链接:PROPAGATION_NESTED versus PROPAGATION_REQUIRES_NEW? Juergen Hoeller解释得非常好

  

PROPAGATION_REQUIRES_NEW启动一项新的独立“内部”交易   对于给定的范围。此事务将被提交或回滚   完全独立于外部交易,拥有自己的交易   隔离范围,它自己的一组锁等。外部事务将   在内部开始时被暂停,并且恢复一次   内心已完成。 ...

     另一方面,

PROPAGATION_NESTED启动“嵌套”事务,   这是现有的一个真正的子交易。会发生什么   是嵌套的开始时将采取保存点   交易。如果嵌套事务失败,我们将回滚到   那个保存点。嵌套事务是外部事务的一部分   事务,所以它只会在外部结束时提交   交易。 ...

答案 1 :(得分:12)

PROPAGATION_REQUIRES_NEW:为每个受影响的事务范围使用完全独立的事务。在这种情况下,底层物理事务是不同的,因此可以独立提交或回滚,外部事务不受内部事务的回滚状态的影响。

PROPAGATION_NESTED:使用可以回滚到的多个保存点的单个物理事务。这种部分回滚允许内部事务作用域触发其作用域的回滚,外部事务能够继续物理事务,尽管已经回滚了一些操作。此设置通常映射到JDBC保存点,因此仅适用于JDBC资源事务。

检查spring documentation

答案 2 :(得分:-4)

请找出差异

1.) Use of NESTED Transaction

如果当前事务存在,则在嵌套事务中执行,其行为类似于PROPAGATION_REQUIRED。 嵌套事务由Spring支持

2.)使用必需的交易 支持当前事务,如果不存在则创建新事务。 。这意味着银行领域如撤回,存款,更新交易

3.使用REQUIRES_NEW交易 创建一个新事务,并暂停当前事务(如果存在)。