由openSession、getCurrentSession和HibernateDaoSupport

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 這是花費最高代價可是最可靠的事務隔離級別。事務被處理爲順序執行。

     除了防止髒讀,不可重複讀外,還避免了幻像讀。

    事務隔離級別主要應用在對大數據的處理方面,與鎖的機制是密不可分的,這裏不贅述。

相關文章
相關標籤/搜索