2017-07-19 378 views
1

我有一個@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應暫停現有事務並創建新事務。爲什麼?

+2

'@ Transactional'不適用於'private'方法。請參閱https://stackoverflow.com/questions/4396284/does-spring-transactional-attribute-work-on-a-private-method。即使對於「公共」方法,它也只適用於從班級以外進行調用的情況。所以你的外線來電者必須打兩個電話。 –

+0

結果對於公共和私人方法都是一樣的。問題是我有嵌套事務。外部方法僅調用父事務。另外,如果我使用外部方法調用它,它不會有效地表示同樣的事情(嵌套事務)嗎? – Abhinav

回答

0

從提供的代碼我會認爲這是因爲你直接調用方法newTransaction()。對於可以處理事務管理,您必須給容器一個機會來攔截方法調用。這可以通過注入bean並從該注入點調用該方法來完成,類型爲bean.newTransaction()

+0

我嘗試將newTransaction()添加到不同的服務,並自動裝配它。行爲仍然是一樣的。沒有工作。 – Abhinav

+0

好的,那可能是錯誤的命中。我想到的另一點是getSessionFactory()。getCurrentSession()的用法。我不知道它是如何處理的,但如果在兩種方法中使用相同的會話,數據庫連接可能是相同的 - 這意味着綁定到原始全局事務。即使新的全局事務真的開始了,數據庫更新也是通過連接舊數據庫來完成的。什麼是getSessionFactory()。getCurrentSession()的實現或者自動裝配呢? – chalda

+0

我沒有修改過hibernate會話類的實現,我只是簡單地使用了基類hibernate類的getCurrSessionFromFactory()。saveOrUpdate(entity)。 – Abhinav