2011-08-26 48 views
1

我試圖在Spring + Struts + Hibernate設置中實現聲明式事務管理。 這是我的applicationContext.xml的一部分在Spring聲明式事務模式下,事務似乎不起作用

<property> 
    <props> 
    <prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop> 
    </props> 
</property> 

我已經定義在我FooService接口類兩個公共方法 - > UpdateFoo,foodooTest 和兩個私有方法(其具有更新邏輯) - >測試1和TEST2

呼叫是這樣:

UpdateFoo->foodooTest->Test1 
        ->Test2 

(foodooTest應該觸發交​​易) 我創建bean

FooService fooService = (FooService)context.getBean("fooService"); 
//and call 
fooService.UpdateFoo(); 

Test2拋出FooException,因此我期望事務回滾。但事實並非如此。提交發生在每個Test1和Test2中(直到異常)。 我使用Hibernate getHibernateTemplate.Merge()進行更新。我的數據庫引擎是InnoDB。

我不知道我在這裏錯過了什麼。

+0

你應該發佈更多相關SUFF:Spring配置以及觸發交易的方法。 – Ralph

回答

1

只有在自定義異常擴展爲RuntimeException的情況下,Spring纔會回滾異常事務。確保FooException延伸RuntimeExceptionreference):

在其默認的配置,Spring框架的事務基礎架構代碼只標誌着運行的情況下,事務回滾,未檢查異常;也就是說,拋出的異常是RuntimeException的一個實例或子類時。 (錯誤也會 - 默認情況下 - 導致回滾)。從事務性方法引發的檢查異常不會導致默認配置中的回滾。

根據你的評論,這裏有2個更多的事情要檢查:1)確保你有一個平臺事務管理器配置。例如:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="mySessionFactory" /> 
</bean> 

此外,如果你想使用註釋進行交易,你需​​要配置它:

<tx:annotation-driven /> 
+0

好吧,我的問題不是真的回滾(我認爲這是控制)。我的問題是在Test1和Test2(我可以在DB中看到)中發生提交,甚至在我繼續之前拋出FooException。 –

+0

是的,它被配置。另外,如果我將'UpdateFoo'添加到應用程序配置中,則事務按預期工作。 (在這兩種情況下,我正在從struts動作中調用UpdateFoo。 –

+0

這意味着您用於測試的Spring配置與您的應用的Spring配置不匹配。請儘可能使兩者匹配。 – atrain