1.事務特性 (ACID)
2.事務的並發問題:
3.事務的隔離級別:
4.hibernate中設置事務的隔離級別:
5.項目中管理事務:
(1)業務開始之前打開事務,業務執行之后提交事務. 執行過程中出現異常.回滾事務.
(2)在dao層操作數據庫需要用到session對象.在service控制事務也是使用session對象完成. 我們要確保dao層和service層使用的使用同一個session對象
(3)在hibernate中,確保使用同一個session的問題,hibernate已經幫我們解決了. 我們開發人員只需要調用sessionFactory.getCurrentSession()方法即可獲得與當前線程綁定的session對象
注意1: 調用getCurrentSession方法必須配合主配置中的一段配置
<!-- 設置hibernate中session與線程綁定 --> <property name="hibernate.current_session_context_class">thread</property>
注意2:通過getCurrentSession方法獲得的session對象.當事務提交時,session會自動關閉.不要手動調用close關閉.
測試getCurrentSession獲得的是與線程綁定的同一個session:
package cn.qlq.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry; import static java.lang.System.out; public class HibernateUtils { private static SessionFactory sessionFactory; // 創建一個對象,一個web項目只有一個SessionFactory static { // 3.3以及之前的版本構建會話工廠對象 // SessionFactory sessionFactory = new // Configuration().configure().buildSessionFactory(); // 5.0之后獲取SessionFactory // 創建服務注冊對象 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); // 創建會話工廠對象 sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); } // 獲得session => 獲得全新session public static Session openSession() { return sessionFactory.openSession(); } // 獲得session => 獲得與線程綁定的session public static Session getCurrentSession() { return sessionFactory.getCurrentSession(); } /** * 測試方法 * * @param args */ public static void main(String[] args) { Session currentSession = HibernateUtils.getCurrentSession(); Session currentSession2 = HibernateUtils.getCurrentSession(); out.println(currentSession); out.println(currentSession2); out.println(currentSession == currentSession2); //true,代表返回的是同一個對象 } }
實際項目中事務管理代碼(同一個與線程綁定的session的事務管理):
service層代碼:
dao層代碼: