2014-03-13 62 views
0

您好,使用Spring/JPA Hibernate會遇到一個問題。Hibernate @Transactionl錯誤

我有服務類methodA()兩個方法和methodB()

@Transactional 
methodA(){ 
    for(){ 
     methodB(); 
    } 

    some other database operations. 
} 

@Transactional 
methodB(){ 
    database Update/Insert Operations. 
    save(); 
} 

如上我在一個循環中調用的methodB從治法。如果任何來自循環的操作失敗或循環外部的數據庫操作失敗,那麼我期待着回滾的trasnastion,因爲methodA()本身就是transactiona。

但我面臨的問題我看到數據得到承諾後數據庫立即methodB()完成後,即使拋出異常從methodA() rollBack。

我也嘗試刪除從methodB()跨越,也試過propogation = NESTED/REQUIRED/MANDATORY。但似乎沒有任何工作。

回答

2

當使用Spring時,這不是事務的工作方式。事務方法必須從外部調用,而不能在其他方法中調用。原因是,在你的情況下,Spring將無法通過AOP代理應用交易,因爲直接從methodA調用methodB,Spring將無法在調用methodB之前應用交易方面。欲瞭解更多信息,有節「理解AOP代理」在第一個看看herehere 10.5.1

+0

+1很好的解釋 – BDR

1

我認爲執行該法將提交後,您已在DAO層method.Here宣佈@Transactional /回滾到數據庫。 定義一個服務層調用這兩個方法的方法,並聲明該方法的@Transactional註釋,並從DAO層中刪除@Transactional。然後DB事務(commit/rollback)只有在執行該服務層方法之後纔會發生。在數據庫回滾將發生的任何方法中出現一些錯誤。

服務層方法看起來像這樣

@Transactional 
public methodTest(){ 
     methodA(); 
     methodB(); 
    }