JavaEE--SSH--hibernate-對事務的管理
hibernate對事務的管理:
1.通過session獲取事務物件.Transaction transaction = session.beginTransaction();
開啟-提交-回滾事務
2.核心配置檔案設定事務的隔離級別.
sessionfactory標籤中配置事務隔離級別屬性:
<property name="hibernate.connection.isolation">4</property> // 1-2-4-8 事務隔離級別
1—Read uncommitted isolation 髒讀,不可重複讀,虛讀都可能發生.
2—Read committed isolation 避免髒讀,但是不可重複讀和虛讀有可能發生.
4—Repeatable read isolation 避免髒讀和不可重複讀,但是虛讀有可能發生的.
8—Serializable isolation 避免髒讀,不可重複讀和虛讀.(序列化的-不可能出現事務併發訪問)
通過上面兩種方法我們已經配置好了事務.但是在實際應用場景中,事務的控制並不是由持久層(Dao)去做,而是應該在Service層去做.Service層中有可能同時呼叫多個Dao實現一個業務邏輯的操作.這就會出現一個問題:如何保證Service中開啟的事務使用的是同一個session物件?
我們有兩個方法去解決:
1.在業務Service層獲取Session,將Session作為引數傳遞給Dao層.(太麻煩,一般不用)
2.通過ThreadLocal將業務層獲取的Session繫結到當前執行緒中,Dao層再獲取Session時,就會獲取到同一個Session了(推薦使用)
那我們如何使用第二種方式呢.其實hibernate已經替我們封裝好了這一切.只需要在主配置檔案中SessionFactory標籤中加一個屬性.
<property name="hibernate.current_session_context_class">thread</property>
注:當我們將事務繫結到當前執行緒後,就不用關閉Session了.這件事情交給hibernate去做.