gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:18:29 27 4
gpt4 key购买 nike

我有一个带有 @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 应该挂起现有事务并创建一个新事务。为什么?

最佳答案

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com