Spring 事务:requires_new 方法从需要的方法调用

Spring transactions: Method with requires_new called from a method with requires

我想了解在嵌套事务对调用和被调用方法具有不同隔离级别的情况下,确切的提交发生时间和回滚发生的时间,

例如,我有两个 spring 服务,我正在从服务 1 的方法 1 调用服务 2 的方法 2。

方法 1 具有必需的事务范围,方法 2 具有 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 完成后再提交?

我感兴趣的是在什么时间点提交发生,数据库中的行锁被释放,这在方法 2 中持续存在。

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

提前致谢,

瓦利

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

tx2 将 commit/rollback 就在您从 service2 return 时,然后 tx1 将从暂停点恢复。 tx2 的结果(无论是导致提交还是回滚)不会影响 tx1 的行为。

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