<rt id="hkid1"></rt>
    <s id="hkid1"><meter id="hkid1"></meter></s>
  1. <rp id="hkid1"><meter id="hkid1"></meter></rp>
    <source id="hkid1"></source>
  2. <ruby id="hkid1"><optgroup id="hkid1"></optgroup></ruby>

    Hibernate事務配置

    小編:管理員 442閱讀 2022.09.14

    //

    Hibernate事務管理

    //

    1. 事務
    2. 設置事務級別
    3. 事務服務層連接

    01

    事務

    什么是事務?

    邏輯上的一組操作,要么一起成功,要么就都不算。不能有的執行了,有的沒執行

    事務的特性?

    原子性

    事務不能分隔

    隔離性

    執行一個事務時, 不應受到其它事務的干擾

    一致性

    事務執行前后 ,數據的完整性要保持一致

    持久性

    操作完成后就在數據庫中

    事務的隔離級別?

    Read uncommitted

    所有問題都會發生

    Read committed

    解決臟讀問題

    Repeatable read

    解決臟讀和不可重復讀

    Serializable

    解決所有問題,效率較低

    隔離級別詳細SQL事務

    02

    設置事務隔離級別

    在核心配置文件hibernate.cfg.xml當中

    通過數字來代表不同的隔離級別

    <property name="hibernate.connection.isolation">4</property>
    復制

    設置的值是1,2,3,4代表四個隔離級別

    03

    事務業務層連接

    為什么在服務層使用事務?

    在dao層的工作是連接數據庫做各個基本功能,比如增刪改查等。而服務層的作用才是去組織dao的小功能去實現完整的業務邏輯并返回結果給web層

    在外部處理時session怎么保持一致?

    因為開啟事務需要session所以服務層需要用到session,而且事務里面語句用的session也應該是一個。那么怎么能保證服務層用的session和事務中兩個方法的session一樣呢?

    首先很容易想到的就是從上往下傳遞的方式

    TestService{
        Session session = HibernateUtil.openSession();
        dao.session = session;
        test(){
            Transaction tra = session.beginTransaction();
            dao.insertMoney();
            dao.update();
            tra.commit();
        }
    復制
    public TestDao{    public static Session session;    public void insertMoney(){
            session.save(obj);
        }    
        public void insertMoney(){
            session.save(obj);
        }
    
    }
    復制

    但這樣有點太笨重,在Hibernate內部綁定了個session在ThreadLocal,也就是說在一次完整請求中即是在一次線程上有一個session,只需要獲取這個session那肯定就是同一個session了

    默認這個是關閉的,需要在核心配置文件打開

    <property name="current_session_context_class">thread</property>
    復制

    并且這個session不需要手動關閉,執行完后會自動關閉

    TestService{
    
        SessionFactory sf = HibernateUtil.getSessionFactory(); 
        test(){
            Transaction tra = sf.getCurrenSession().beginTransaction();
            dao.insertMoney();
            dao.update();
            tra.commit();
        }
    }
    復制
    public TestDao{    
        SessionFactory sf = Hibernate.getSessionFactory();    public void insertMoney(){   
           sf.getCurrentSession().session.save(obj); 
        }       
        public void insertMoney(){  
           sf.getCurrentSession().session.save(obj);  
        } 
    }
    復制
    關聯標簽:
    快三群