2010-03-12 43 views
2

在spring中使用hibernate時,有人可以解釋會話單元的工作和事務是如何處理的?使用spring和hibernate時,會話/事務如何處理?

  1. 是在頁面請求開始時開始的事務,並在最後提交?
  2. 我可以有多個數據庫調用每個請求,每個都有不同的事務級別?例如有些保留爲默認值,而另一些則是未讀取的?
+2

和往常一樣,你可以以任何你想要的方式做到這一點,它並不決定你的技術。所以你的問題的答案是「是」。更具體的「如何讓它做X」將是一個更有用的問題。 – skaffman 2010-03-12 21:35:40

+0

skaffman的評論是迄今爲止最好的答案 – 2010-03-13 12:44:30

回答

3

是在頁面請求開始時開始的事務,並在最後提交?

在web應用中,打開/關閉Session通常使用 「Open Session in View」 圖案完成。春天爲此配備了OpenSessionInViewFilterOpenSessionInViewInterceptor。兩者都通過當前線程提供Hibernate Sessions,這些線程將由事務管理器自動檢測。它適用於通過HibernateTransactionManagerJtaTransactionManager以及非事務性執行(如果適當配置)的服務層事務。

事務劃分通常在服務方法級別完成,使用Spring AOP將它們包裝在事務中。

我可以有多個數據庫調用每個請求,每個都有不同的事務級別?例如有些保留爲默認值,而另一些則是未讀取的?

您可以使用不同隔離級別的嵌套事務。請參閱Transaction Management一章。

+0

感謝您的貢獻!其實,每次我需要一些特別的東西時,我都會看到你的評論。實際上,我正在尋找擴展兩個事務間Hibernate會話生命週期的方法(例如兩個'@ Transactional'方法)來保存L1緩存,而且我還沒有想過你的文章中提到的綁定會話到HTTP的助手請求。例如,如果我想爲'SimpleJaxWsServiceExporter'公開的JAX-WS WebService實現相同的功能(當請求/響應流不由Spring管理時),你能建議什麼? – 2010-10-07 16:24:18

1

您的問題:

1 - 是該交易在 開始頁面請求的啓動,以及 致力於在結束了嗎?

不完全是。 Spring MVC中的常用的工作流程是:

requestDispatcher->控制器 - >服務電話(交易開始,在這裏結束)

服務可以調用的DAO,DAO將通過Hibernate的交談數據存儲。

交易可以繼續生活在http響應之後。例如服務在一個線程中運行。

2,可我每次 要求多個數據庫調用,每個有不同的 交易水平?例如有些是 作爲默認值,而另一些是 未讀取?

是的,你當然可以。假設您的應用程序執行遷移作業。一個請求說「開始遷移!」然後你的服務將通過源數據庫讀取數據,並在你的遷移邏輯上做一些神奇的基礎,最後寫入目標數據庫並提交事務。

相關問題