2017-07-19 109 views
1

我有一个@Transaction方法,用@Transaction(Propagation.REQUIRES_NEW)调用一个方法。在父方法中发生异常的情况下,这两个事务都会回滚。父@Transaction失败时,回滚嵌套的@Transaction(Propagation.REQUIRES_NEW)

父事务:

@Transactional(propagation = Propagation.REQUIRED) 
public void test() { 
    SampleClassParent sampleClassParent = new SampleClassParent(); 
    sampleClassParent.setAddressId(2545L); 
    sampleClassParent.setUserId(21660742L); 
    getBaseDao().saveOrUpdate(sampleClassParent); 
    newTransaction(); 

    // getting an exception purposefully 
    User user = null; 
    user.getId(); // Will throw a null pointer exception 
} 

嵌套事务:

@Transactional(propagation = Propagation.REQUIRES_NEW) 
private void newTransaction(){ 
    SampleClassNested sampleClassNested = new SampleClassNested(); 
    sampleClassNested.setCityId(15747L); 
    sampleClassNested.setStoreId(5L); 
    getBaseDao().saveOrUpdate(sampleClassNested); 
} 

SaveOrUpdate方法:(使用Hibernate 3.3.2)

// Wrapper around hibernate method 
    public void saveOrUpdate(Object entity, boolean delayCommit) { 
     getSessionFactory().getCurrentSession().saveOrUpdate(entity); 
    } 

未引发异常时成功创建所有条目。 SampleClassParent和SampleClassNested是Hibernate实体类。

这里两个事务都回滚了,但理想情况下,Propagation.REQUIRES_NEW应暂停现有事务并创建新事务。为什么?

+2

'@ Transactional'不适用于'private'方法。请参阅https://stackoverflow.com/questions/4396284/does-spring-transactional-attribute-work-on-a-private-method。即使对于“公共”方法,它也只适用于从班级以外进行调用的情况。所以你的外线来电者必须打两个电话。 –

+0

结果对于公共和私人方法都是一样的。问题是我有嵌套事务。外部方法仅调用父事务。另外,如果我使用外部方法调用它,它不会有效地表示同样的事情(嵌套事务)吗? – Abhinav

回答

0

从提供的代码我会认为这是因为你直接调用方法newTransaction()。对于可以处理事务管理,您必须给容器一个机会来拦截方法调用。这可以通过注入bean并从该注入点调用该方法来完成,类型为bean.newTransaction()

+0

我尝试将newTransaction()添加到不同的服务,并自动装配它。行为仍然是一样的。没有工作。 – Abhinav

+0

好的,那可能是错误的命中。我想到的另一点是getSessionFactory()。getCurrentSession()的用法。我不知道它是如何处理的,但如果在两种方法中使用相同的会话,数据库连接可能是相同的 - 这意味着绑定到原始全局事务。即使新的全局事务真的开始了,数据库更新也是通过连接旧数据库来完成的。什么是getSessionFactory()。getCurrentSession()的实现或者自动装配呢? – chalda

+0

我没有修改过hibernate会话类的实现,我只是简单地使用了基类hibernate类的getCurrSessionFromFactory()。saveOrUpdate(entity)。 – Abhinav