2012-10-12 29 views
2

Spring 2.5,Hibernate。如何給spring的事務管理器添加深度

我們的應用程序被構建爲具有服務層和管理器層。服務層提供所有隻讀服務並向UI傳遞結果。對於需要更改數據庫的服務,服務層執行所有初始只讀函數,然後調用管理器層。

我們已經建立了一個圍繞我們的管理層的事務建議,以捕獲來自管理層的所有異常並回滾這些事務。這在大部分情況下工作得很好。

問題出在我們有一位經理打電話給另一位經理來執行某些功能的情況。此功能會引發異常,這是從UI調用時的一個真正異常,但在客戶機管理器內部處理並返回成功的結果。事務管理器發現拋出了異常並且無論如何回滾事務,即使異常處理成功。

這是導致我們悲傷的交易屬性。

<tx:method name="*" propagation="REQUIRED" rollback-for="Throwable" no-rollback-for="OverridableException"/> 

有沒有一種方法可以指定深度?我想說,只在最高管理器層調用中回滾異常,而不是在同一事務中的後續調用中的異常。

謝謝!

回答

0

我最終重構了內部服務方法,將拋出異常的那部分拉出到另一個方法中。然後我調用該方法來預先批准我在外部服務中所做的操作,並從內部服務調用新方法來拋出異常。這樣,我已經繞過了拋出的異常。

希望有沒有投入更多的往往是一個更好的辦法。:(

2

通常情況下,您希望在事務性建議中將調用包裝到服務層,以便如果您的一個服務類向多個不同的管理人員進行多次調用,則所有這些都會被包裝在一個事務中 - 如果您正在進行更改,他們成功或回滾在一起。這通常被稱爲(以及其他名稱)Unit of Work pattern

所以我的建議是重新考慮你在哪裏應用你的交易定義。但是,如果這不可行,您可能需要將交易建議更改爲propagation=REQUIRES_NEW,以便每個經理呼叫啓動一個新的交易 - 並因此在一個經理類別調用另一個經理類別時不回滾整個交易時回滾內部交易。

+0

的問題是不會解決這個問題。我還是希望我的經理叫其他人來隱藏它的關係,並封裝功能。第二個調用仍然會產生回滾。 感謝REQUIRES_NEW。我將需要與我們的團隊討論這個問題,並確保它適合我。我對創建一個獨立事務感到擔憂。 – Thom

+0

我可能會對根目錄感到困惑你需要解決的問題是嵌套管理器調用引發的異常,這個異常是否會離開外部管理器?它是否被外部管理器或內部管理器捕獲? –

+0

引發內部經理,由外部經理抓住並處理。 – Thom