我有一个使用@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方法:(使用休眠3.3.2)

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


不引发任何异常时,所有条目均创建成功。
SampleClassParent和SampleClassNested是休眠实体类。

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

最佳答案

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

关于java - 当父@Transaction失败时,将回滚嵌套的@Transaction(Propagation.REQUIRES_NEW),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45184501/

10-13 02:05