当父@Transaction失败时,将回滚嵌套的@Transaction(Propagation.REQUIRES_NEW)

时间:2017-07-19 08:05:53

标签: java spring hibernate transactions spring-transactions

我有一个@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 Entity类。

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

1 个答案:

答案 0 :(得分:0)

根据提供的代码,我认为这是因为您直接调用方法newTransaction()。对于可以处理事务管理,您必须让容器有机会拦截方法调用。这可以通过注入bean并从该注入点调用方法来实现,bean.newTransaction()