我有一个@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应暂停现有事务并创建新事务。为什么?
答案 0 :(得分:0)
根据提供的代码,我认为这是因为您直接调用方法newTransaction()
。对于可以处理事务管理,您必须让容器有机会拦截方法调用。这可以通过注入bean并从该注入点调用方法来实现,bean.newTransaction()
。