2015-10-15 140 views
0

我想明白的时候正好犯发生,当有不同的隔离级别嵌套事务的情况下准确地回滚发生在主叫和被叫的方法,Spring的事务中:与REQUIRES_NEW从一个方法调用的方法需要

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

方法1具有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或将春天等待,直到方法1结束,然后提交?

我感兴趣的是在什么时候发生提交,并且数据库中的行锁被释放,这在method2中是持久的。

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

由于事先

瓦利

回答

0

当你进入服务2的方法2,服务1的交易(说TX1)禁赛和一个新的事务创建服务2(比如说TX2)。这个新事务独立于以前的事务,并将独立提交或回滚。

只有从service2返回时,tx2才会提交/回滚,之后tx1将从暂停的点重新开始。 tx2(commit或rollback)的结果不会影响tx1的行为。

请阅读春季文档here。有关事务传播的更多信息,请参见第16.5.7节。

+0

感谢您的快速回复。这正是我的理解。但是,我发生的事情是回滚正在按预期工作,当涉及到提交,虽然它是独立提交,看起来只有在方法1完成之后才发生提交.. – Rama

+0

您是否使用任何ORM?如果是的话,冲洗模式是什么?不知道这是否是确切的情况。 –

+0

感谢指针阿米拉。进一步分析发现,嵌套事务按预期工作,问题发生在method1中,有一些提交的表正在method2中修改。由于同一条记录在两个不同的事务中被修改,DB中的会话被阻塞。现在我已经将所有的代码移到了处理相同记录的方法,并解决了问题。感谢你的支持。 – Rama

相关问题