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

2022-08-31 11:03:35

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


答案 1

看到这个链接:PROPAGATION_NESTED与PROPAGATION_REQUIRES_NEW?Juergen Hoeller很好地解释了这一点。-- Spring Source论坛于2019年2月28日完全离线,但您可以在下面的引文中阅读文章的相关部分

PROPAGATION_REQUIRES_NEW为给定范围启动一个新的、独立的“内部”事务。此事务将完全独立于外部事务提交或回滚,具有自己的隔离作用域,自己的一组锁等。外部事务将在内部事务开始时暂停,并在内部事务完成后恢复。...

另一方面,PROPAGATION_NESTED启动“嵌套”事务,这是现有事务的真正子事务。将要发生的事情是,将在嵌套事务开始时获取保存点。如果嵌套事务失败,我们将回滚到该保存点。嵌套事务是外部事务的一部分,因此它只会在外部事务结束时提交。...


答案 2

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

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

检查弹簧文档


推荐