java - Spring 交易: Method with requires_new called from a method with requires

标签 java spring transactions nested-transactions

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

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

方法 1 具有 REQUIRED 事务范围,方法 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 将启动一个新事务,但是它会立即在现有 method2 上提交还是 spring 会等到 method1 完成然后提交?

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

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

提前致谢,

瓦利

最佳答案

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

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

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

关于java - Spring 交易: Method with requires_new called from a method with requires,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33140163/

相关文章:

java - 有什么方法可以在 Java 中返回多态 this 吗?

SpringMVC : DispatcherServlet makes extra requests to view

java - 通过字段 'personRepository' 表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException :

SQLite 事务不工作

php - 如何在 mysqli 中开始和结束事务?

c# - 使用 finally 而不是 catch

java - 在Eclipse中更改单元测试包名称与相应的生产代码包

java - Selenium Takes截屏捕获 "Please wait..."消息

java - 给定一个 ParameterizedType,我如何创建这种类型的实例?

java - Spring AOP 编程时出现奇怪的异常