在spring中使用hibernate時,有人可以解釋會話單元的工作和事務是如何處理的?使用spring和hibernate時,會話/事務如何處理?
- 是在頁面請求開始時開始的事務,並在最後提交?
- 我可以有多個數據庫調用每個請求,每個都有不同的事務級別?例如有些保留爲默認值,而另一些則是未讀取的?
在spring中使用hibernate時,有人可以解釋會話單元的工作和事務是如何處理的?使用spring和hibernate時,會話/事務如何處理?
是在頁面請求開始時開始的事務,並在最後提交?
在web應用中,打開/關閉Session
是通常使用 「Open Session in View」 圖案完成。春天爲此配備了OpenSessionInViewFilter
或OpenSessionInViewInterceptor
。兩者都通過當前線程提供Hibernate Sessions
,這些線程將由事務管理器自動檢測。它適用於通過HibernateTransactionManager
或JtaTransactionManager
以及非事務性執行(如果適當配置)的服務層事務。
事務劃分通常在服務方法級別完成,使用Spring AOP將它們包裝在事務中。
我可以有多個數據庫調用每個請求,每個都有不同的事務級別?例如有些保留爲默認值,而另一些則是未讀取的?
您可以使用不同隔離級別的嵌套事務。請參閱Transaction Management一章。
感謝您的貢獻!其實,每次我需要一些特別的東西時,我都會看到你的評論。實際上,我正在尋找擴展兩個事務間Hibernate會話生命週期的方法(例如兩個'@ Transactional'方法)來保存L1緩存,而且我還沒有想過你的文章中提到的綁定會話到HTTP的助手請求。例如,如果我想爲'SimpleJaxWsServiceExporter'公開的JAX-WS WebService實現相同的功能(當請求/響應流不由Spring管理時),你能建議什麼? – 2010-10-07 16:24:18
它通常使用面向方面編程(AOP)聲明式配置。您可以定義哪些bean,類,包或方法需要事務,Spring將以類似於EJB的方式提供它。得益於AOP,您可以完全控制事務包含的內容和方式。
您的問題:
1 - 是該交易在 開始頁面請求的啓動,以及 致力於在結束了嗎?
不完全是。 Spring MVC中的常用的工作流程是:
requestDispatcher->控制器 - >服務電話(交易開始,在這裏結束)
服務可以調用的DAO,DAO將通過Hibernate的交談數據存儲。
交易可以繼續生活在http響應之後。例如服務在一個線程中運行。
2,可我每次 要求多個數據庫調用,每個有不同的 交易水平?例如有些是 作爲默認值,而另一些是 未讀取?
是的,你當然可以。假設您的應用程序執行遷移作業。一個請求說「開始遷移!」然後你的服務將通過源數據庫讀取數據,並在你的遷移邏輯上做一些神奇的基礎,最後寫入目標數據庫並提交事務。
和往常一樣,你可以以任何你想要的方式做到這一點,它並不決定你的技術。所以你的問題的答案是「是」。更具體的「如何讓它做X」將是一個更有用的問題。 – skaffman 2010-03-12 21:35:40
skaffman的評論是迄今爲止最好的答案 – 2010-03-13 12:44:30