我无法理解PROPAGATION_REQUIRES_NEW
和PROPAGATION_NESTED
传播策略之间的行为差异。在我看来,在这两种情况下,当前过程都是回滚的,而不是整个事务。有什么线索吗?
我无法理解PROPAGATION_REQUIRES_NEW
和PROPAGATION_NESTED
传播策略之间的行为差异。在我看来,在这两种情况下,当前过程都是回滚的,而不是整个事务。有什么线索吗?
Answers:
看到此链接:PROPAGATION_NESTED与PROPAGATION_REQUIRES_NEW?Juergen Hoeller对此进行了很好的解释。-春季高峰论坛是完全脱机SICE 2019 2月28日,但你可以在下面的报价阅读文章的相关部分
PROPAGATION_REQUIRES_NEW为给定范围启动一个新的,独立的“内部”交易。此事务将完全独立于外部事务进行提交或回滚,具有自己的隔离范围,自己的一组锁等。外部事务将在内部事务的开始处挂起,并在内部事务具有完成。...
另一方面,PROPAGATION_NESTED启动“嵌套”事务,这是现有事务的真实子事务。将会发生的事情是,在嵌套事务开始时将获取一个保存点。如果嵌套事务失败,我们将回滚到该保存点。嵌套事务是外部事务的一部分,因此它将仅在外部事务的结尾提交。...
PROPAGATION_REQUIRES_NEW:对每个受影响的交易范围使用完全独立的交易。在那种情况下,底层的物理事务是不同的,因此可以独立地提交或回滚,而外部事务不受内部事务回滚状态的影响。
PROPAGATION_NESTED:使用具有多个保存点的单个物理事务,它可以回滚到该保存点。这种部分回滚允许内部事务作用域触发其范围的回滚,尽管某些操作已回滚,但外部事务仍能够继续物理事务。此设置通常映射到JDBC保存点,因此仅适用于JDBC资源事务。
检查弹簧文档
PROPAGATION_REQUIRES_NEW
:外部事务将在内部事务的开始处暂停,并在内部事务完成后恢复。每个内部事务在完成时都会提交/回滚。PROPAGATION_NESTED
:嵌套事务是外部事务的一部分,因此它将仅在外部事务的结尾提交。