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

Ale*_*noy 69 java spring transactions propagation

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

Ral*_*lph 100

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

PROPAGATION_REQUIRES_NEW为给定范围启动新的独立"内部"事务.此事务将完全独立于外部事务提交或回滚,具有自己的隔离范围,自己的锁定等.外部事务将在内部事务开始时暂停,并在内部事务开始时恢复完成....

另一方面,PROPAGATION_NESTED启动"嵌套"事务,这是现有事务的真正子事务.将发生的是在嵌套事务开始时将采用保存点.如果嵌套事务失败,我们将回滚到该保存点.嵌套事务是外部事务的一部分,因此它只会在外部事务的末尾提交....

  • 这个Spring参考非常详细地解释了它:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/data-access.html#tx-propagation (2认同)

Nan*_*ale 12

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

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

检查弹簧文档

  • 是的,我理解了下划线的区别,但是我看不出它的行为会有什么不同:在一种情况下,我将回滚到前一个保存点,在另一种情况下,我将回滚当前事务而不是外部事务,但是实际上,在这两种情况下,我都会回滚到当前原子操作的开头,然后从那一点开始. (2认同)