作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解在调用和被调用方法具有不同隔离级别的嵌套事务的情况下,确切的提交何时发生以及何时确切的回滚,
例如,我有两个 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/
我是一名优秀的程序员,十分优秀!