我有一个使用@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/