Spring和Hibernate的集成的一個要點就是對事務的支持,openSession、getCurrentSession都是編程式事務(手動設置事務的提交、回滾)中重要的對象,HibernateDaoSupport則提供了更方便的聲明式事務支持。web
Hibernate中最重要的就是Session對象的引入,它是對jdbc的深度封裝,包括對事務的處理,Session對象經過SessionFactory來管理,openSession和getCurrentSession是管理session的重要的方法。數據庫
openSession和getCurrentSession的根本區別在於有沒有綁定當前線程,因此,使用方法有差別:編程
* openSession沒有綁定當前線程,因此,使用完後必須關閉,session
* currentSession和當前線程綁定,在事務結束後會自動關閉。大數據
關於事務的邊界和傳播:spa
一般狀況下事務的邊界須要設置在業務邏輯處理層中,可是,若是在一個業務中涉及到多個業務邏輯層之間的方法,且須要在同一個事務中運行,那麼,這就涉及到了事務的傳播性。線程
若是使用openSession,就要在dao層的方法中傳遞session,而這種作法是很糟糕的,首先增長了參數的個數,另外,方法是否須要事務,徹底是能夠當作一種獨立的服務抽離出的。orm
由於currentSession是線程級別的,因此,只要業務邏輯方法在同一個線程中,就不會擔憂上面的問題。這也是currentSession的一個優越處之一。對象
使用HibernateDaoSupport聲明式事務:繼承
Spring與Hibernate的集成使用最多的是HibernateDaoSupport,它對session的獲取以及事務作了進一步的封裝,只須要關注dao的實現,而不用擔憂某個地方的事務是否關閉。
關於異常與事務回滾:
Spring在遇到運行期異常(繼承了RuntimeException)的時候纔會回滾,若是是Exception(如用戶輸入密碼錯誤)拋出就好,事務會繼續往下進行。
Spring對異常的處理的靈活性仍是比較高的,能夠配置遇到某個Exception進行回滾,某個RuntimeException不回滾,可是對於EJB就沒有這麼靈活了,EJB至關因而固定的套餐。
Spring事務的隔離級別:
1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別。
另外四個與JDBC的隔離級別相對應。
2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務能夠看到這個事務未提交的數據。
這種隔離級別會產生髒讀,不可重複讀和幻像讀。
3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交後才能被另一個事務讀取。另一個事務不能讀取該事務未提交的數據
4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現幻像讀。
它除了保證一個事務不能讀取另外一個事務未提交的數據外,還保證了避免下面的狀況產生(不可重複讀)。
5. ISOLATION_SERIALIZABLE 這是花費最高代價可是最可靠的事務隔離級別。事務被處理爲順序執行。
除了防止髒讀,不可重複讀外,還避免了幻像讀。
事務隔離級別主要應用在對大數據的處理方面,與鎖的機制是密不可分的,這裏不贅述。