MySQL的事務、JDBC事務操作: 詳細見這篇文章:比較詳細 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔離級別: 再核心配置文件中: 這裡是二進位,轉換成十進位就是1,2,4,8 項目中管理事務: 沒有學習hibe ...
MySQL的事務、JDBC事務操作:
詳細見這篇文章:比較詳細
http://www.cnblogs.com/xuyiqing/p/8430214.html
如何在hibernate中配置隔離級別:
再核心配置文件中:
<!-- 指定hibernate操作資料庫時的隔離級別 #hibernate.connection.isolation 1|2|4|8 0001 1 讀未提交 0010 2 讀已提交 0100 4 可重覆讀 1000 8 串列化 --> <property name="hibernate.connection.isolation">4</property>
這裡是二進位,轉換成十進位就是1,2,4,8
項目中管理事務:
沒有學習hibernate框架以前,在項目中,開啟事務在業務層(service),執行之後提交或回滾
而在hibernate框架中,也是這樣,操作資料庫需要用到的session對象,一定保證,service層和dao層的session是同一個
類似servlet項目中需要確保service層和dao層的connection對象一致,當時用到了綁定線程
(這是以前sevlet項目中的一個工具類,可以瀏覽下對比)
package utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DataSourceUtils { private static DataSource dataSource = new ComboPooledDataSource(); private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); // 直接可以獲取一個連接池 public static DataSource getDataSource() { return dataSource; } // 獲取連接對象 public static Connection getConnection() throws SQLException { Connection con = tl.get(); if (con == null) { con = dataSource.getConnection(); tl.set(con); } return con; } // 開啟事務 public static void startTransaction() throws SQLException { Connection con = getConnection(); if (con != null) { con.setAutoCommit(false); } } // 事務回滾 public static void rollback() throws SQLException { Connection con = getConnection(); if (con != null) { con.rollback(); } } // 提交並且 關閉資源及從ThreadLocall中釋放 public static void commitAndRelease() throws SQLException { Connection con = getConnection(); if (con != null) { con.commit(); // 事務提交 con.close();// 關閉資源 tl.remove();// 從線程綁定中移除 } } // 關閉資源方法 public static void closeConnection() throws SQLException { Connection con = getConnection(); if (con != null) { con.close(); } } public static void closeStatement(Statement st) throws SQLException { if (st != null) { st.close(); } } public static void closeResultSet(ResultSet rs) throws SQLException { if (rs != null) { rs.close(); } } }View Code
在hibernate框架中,原理是一樣的,綁定線程
但是,只需要在核心配置文件中配置:
<!-- 指定session與當前線程綁定 --> <property name="hibernate.current_session_context_class">thread</property>
代碼只需一行:
SessionFactory sf = new Configuration().configure().buildSessionFactory(); sf.getCurrentSession();
簡單的測試即可理解:
package demo; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import utils.HibernateUtils; //測試getCurrentSession public class Demo { @Test //返回同一個與線程綁定的session public void fun1(){ Session session1 = HibernateUtils.getCurrentSession(); Session session2 = HibernateUtils.getCurrentSession(); System.out.println(session1==session2);//true } @Test //返回不同的session public void fun2(){ Session session1 = HibernateUtils.openSession(); Session session2 = HibernateUtils.openSession(); System.out.println(session1==session2);//false } }
補上工具類:
package utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory sf; static{ //1 創建,調用空參構造 Configuration conf = new Configuration().configure(); //2 根據配置信息,創建 SessionFactory對象 sf = conf.buildSessionFactory(); } //獲得session => 獲得全新session public static Session openSession(){ //3 獲得session Session session = sf.openSession(); return session; } //獲得session => 獲得與線程綁定的session public static Session getCurrentSession(){ //3 獲得session Session session = sf.getCurrentSession(); return session; } }View Code
註意:
通過getCurrentSession方法獲得的session對象,事務提交時候,會自動關閉session,不要手動關閉,否則會有異常