1

我想了解在嵌套事务与调用和被调用方法的隔离级别不同的情况下,何时准确提交以及何时准确回滚,

例如,我有两个 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可以实现嵌套事务。

提前致谢,

瓦利

4

1 回答 1

4

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

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

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

于 2015-10-15T05:24:47.600 回答