我有一个@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应暂停现有事务并创建新事务。为什么?
'@ Transactional'不适用于'private'方法。请参阅https://stackoverflow.com/questions/4396284/does-spring-transactional-attribute-work-on-a-private-method。即使对于“公共”方法,它也只适用于从班级以外进行调用的情况。所以你的外线来电者必须打两个电话。 –
结果对于公共和私人方法都是一样的。问题是我有嵌套事务。外部方法仅调用父事务。另外,如果我使用外部方法调用它,它不会有效地表示同样的事情(嵌套事务)吗? – Abhinav