我想了解在嵌套事务对调用方法和被调用方法具有不同隔离级别的情况下,何时发生确切的提交以及何时发生确切的回滚,
例如,我有两个spring服务,并且我从service1的method1调用service2的method2。
方法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将启动一个新事务,但是它将在现有的method2上立即提交,还是会在方法1完成之前由弹簧等待然后提交?
我对何时发生提交和DB中的行锁被释放(在method2中保持不变)感兴趣。
注意:在这里,我将这两种方法都放在了不同的服务中,以便spring可以实现嵌套事务。
提前致谢,
选择
当您输入service2的方法2时,service1的事务(例如tx1
)将被挂起,并为service2(例如tx2
)创建一个新的事务。此新事务独立于先前的事务,并且将独立地提交或回滚。
仅当您从service2返回时,tx2才会提交/回退,而在那之后tx1将从暂停点恢复。tx2的结果(无论是导致提交还是回滚)都不会影响tx1的行为。
请阅读Spring文档。有关交易传播的更多信息,请参见16.5.7节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句