【问题标题】:Spring transactions: Method with requires_new called from a method with requiresSpring事务:从带有requires的方法调用带有requires_new的方法
【发布时间】:2015-10-15 04:56:08
【问题描述】:

如果嵌套事务对调用和被调用方法具有不同的隔离级别,我想了解何时准确提交以及何时准确回滚,

例如,我有两个spring服务,我从service1的method1调用service2的method2。

Method1 具有 REQUIRED 事务范围,Method2 具有 REQUIRES_NEW 事务范围,如下面的程序所示。

Service1 {

 @Transactional(propagation = Propagation.REQUIRED)
method1()
{
    for(int i=0; i<10; i++){
        service2.method2();
    }

    // Some more code which takes some time to process
}

}


Service2 {
 @Transactional(propagation = Propagation.REQUIRES_NEW)
 method2()
 {
    //Save some information to DB
    // Save an object using JPA
 }
}

现在我的问题是, 据我了解,REQUIRES_NEW 将启动一个新事务,但它会立即在现有方法 2 上提交,还是 spring 会等到方法 1 完成然后提交?

我感兴趣的是提交发生的时间点以及 DB 中的行锁被释放,并保留在方法 2 中。

注意:这里我把这两个方法都放在了不同的服务中,这样spring就可以实现嵌套事务了。

提前致谢,

有效

【问题讨论】:

    标签: java spring transactions nested-transactions


    【解决方案1】:

    当你进入 service2 的方法 2 时,service1 的事务(比如tx1)被挂起,并且一个新的事务被创建到 service2(比如 tx2)。这个新事务独立于之前的事务,将独立提交或回滚。

    当您从 service2 返回时,tx2 将提交/回滚,之后 tx1 将从暂停点恢复。 tx2 的结果(无论是提交还是回滚)都不会影响 tx1 的行为。

    请阅读Spring documentation。有关事务传播的更多信息,请查看第 16.5.7 节。

    【讨论】:

    • 感谢您的快速回复。这也是我的理解。但是发生在我身上的是回滚按预期工作,当涉及到提交时,虽然它是独立提交,但看起来只有在方法 1 完成后才会发生提交..
    • 你在使用任何 ORM 吗?如果是这样,什么是冲洗模式?不确定这是否是确切的情况。
    • 感谢阿米拉的指点。经过进一步分析,发现嵌套事务按预期工作,问题出在方法 1 中,有一些提交正在方法 2 中修改的表。由于在两个不同的事务中修改了相同的记录,因此数据库中的会话被阻塞。现在我已将所有代码移至处理相同记录的方法,问题已解决。感谢您的支持。
    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多