我不太理解 PROPAGATION_REQUIRES_NEW
和 PROPAGATION_NESTED
传播策略之间的行为差异。在我看来,这两种方式都会回滚当前进程但不会回滚整个事务。有什么线索吗?
我不太理解 PROPAGATION_REQUIRES_NEW
和 PROPAGATION_NESTED
传播策略之间的行为差异。在我看来,这两种方式都会回滚当前进程但不会回滚整个事务。有什么线索吗?
请参阅此链接:PROPAGATION_NESTED与PROPAGATION_REQUIRES_NEW的区别? Juergen Hoeller 很好地解释了它。
PROPAGATION_REQUIRES_NEW会为给定范围启动一个新的、独立的“内部”事务。这个事务将完全独立于外部事务,具有自己的隔离范围、锁集等,在内部事务开始时挂起外部事务,在内部事务完成后恢复外部事务。
另一方面,PROPAGATION_NESTED会启动一个“嵌套”的事务,它是现有事务的真正子事务。在嵌套事务开始时,将保存一个保存点。如果嵌套事务失败,我们将回滚到该保存点。嵌套事务是外部事务的一部分,因此它只能在外部事务结束时提交。
PROPAGATION_REQUIRES_NEW:对于每个受影响的事务范围,使用完全独立的事务。在这种情况下,底层物理事务是不同的,因此可以单独提交或回滚,外部事务不受内部事务回滚状态的影响。
PROPAGATION_NESTED:使用单个物理事务和多个保存点,可以将其回滚到某些保存点。这样的部分回滚允许内部事务范围触发其范围的回滚,而外部事务能够继续物理事务,尽管某些操作已被回滚。该设置通常映射到JDBC保存点,因此仅适用于JDBC资源事务。
请查看Spring文档
PROPAGATION_REQUIRES_NEW
:外部事务将在内部事务开始时被挂起,并在内部事务完成后恢复。每个内部事务在完成时都会提交/回滚。PROPAGATION_NESTED
:嵌套事务是外部事务的一部分,因此只有在外部事务结束时才会提交。 - Nandkumar Tekale1.) Use of NESTED Transaction
如果当前存在事务,则在嵌套事务中执行,否则像PROPAGATION_REQUIRED一样行为。 Spring支持嵌套事务
2.)使用REQUIRED事务 支持当前事务,如果不存在则创建一个新事务。 这意味着对于银行领域的取款、存款、更新事务。
3.)使用REQUIRES_NEW事务 创建一个新事务,并挂起当前事务(如果存在)。