我有一個@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