You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Propagation.REQUIRES_NEW时,首次调用添加的数据库行是否在二次调用可见?

@Transactional(REQUIRES_NEW) 下,前一次事务插入的数据在后续事务中是否可见?

我有一个标注了@Transactional的方法a(),它会两次调用方法b()。方法b()标注了@Transactional(propagation = Propagation.REQUIRES_NEW),负责向数据库添加数据行,且这两个方法分属不同类。我的问题是:由于事务传播使用了Propagation.REQUIRES_NEW,首次调用b()添加到数据库的行,在第二次调用b()时是否可见?

相关代码如下:

class A {
    private B bInst;
    @Transactional
    public void a() {
        bInst.b();
        bInst.b();
    }
}

class B {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void b() {
        // 添加数据行
    }
}

另外,我认为数据是否可用取决于第一个事务是否完成,这个观点正确吗?还是说第二个事务启动时第一个事务必然已完成?


核心结论

首次调用b()插入的数据,在第二次调用b()时完全可见,且第二个观点成立:第二个事务启动时,第一个b()的事务必然已经完成。

具体解释

当方法标注Propagation.REQUIRES_NEW时,Spring的事务机制会按以下流程执行:

  • 调用b()时,先暂停当前a()的事务(如果存在)
  • 开启一个全新的独立事务执行b()的逻辑
  • b()执行完毕后,这个新事务会立即提交,之后恢复之前暂停的a()的事务

所以第一次调用b()的事务会在执行结束后立刻提交,数据已经持久化到数据库。第二次调用b()时,会开启另一个独立事务,直接读取数据库中已提交的数据,自然能看到第一次插入的行。

对观点的验证

你“数据是否可用取决于第一个事务是否完成”的说法不准确——因为REQUIRES_NEW的特性强制第一个b()的事务在第二个b()启动前完成并提交,不存在不确定性。第二个事务启动时,第一个b()的事务必然已经完成。


内容的提问来源于stack exchange,提问作者Vladislav Tsarenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:47:10