![](https://csdnimg.cn/release/download_crawler_static/27170613/bg4.jpg)
SessionFactory
SessionFactory 负责创建 Session 实例
SessionFactory sessionFactory = config.buildSessionFactory()
Session
Session 是持久层的基础,相当于 JDBC中的 connection
Session session = sessionFactory.openSession();
基于 JDBC的事务管理
Transaction tr = session.beginTransaction();
,,
Tr.commit();
基于 JTA的事务管理
JTA提供了跨 Session 的事务管理能力
JTA事务管理则由 JTA容器实现, JTA容器对当前加入事务的众多 Connection 进行调度
JTA的事务周期可横跨多个 JDBC Connection 的生命周期
JTA事务是由 JTA Container 维护,而参与事务的 Connection 无需对事务管理进行干涉
悲观锁 (Pessimistic Locking)
指的是对数据被外界 ( 包括本系统当前的其他事务,以及来自外部系统的事务处理 ) 修改持保
守态度,因此,在整个数据处理过程中,将数据处于锁定状态
Query query = session.createQuery( “from TUser ”)
Query.setLockMode( “user ”,LockMode.UPGRADE);
对返回的所有 user 记录进行枷锁
Hibernate 的( 悲观锁 ) 加锁模式
LockMode.NONE:无锁机制
LockMode.WRITE:Hibernate 在 Insert 和 Update 记录的时候会自动获取
LockMode.READ:Hibernate 在读取记录的时候会自动获取
LockMode.UPGRADE:利用数据库的 for update 字句加锁
LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用 Oracle 的 for update nowait 字句实
现加锁
Criteria.setLockMode
Query.setLockMode
Session.lock
乐观锁 (Pessimistic Locking)
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性
乐观锁,大多是基于数据版本 (Version) 记录机制实现
乐观锁机制避免了长事务中的数据库加锁开销
乐观锁机制往往基于系统中的数据存储逻辑,因此也具备局限性
Hibernate 在其数据访问引擎中内置了乐观锁实现
getCurrentSession 的使用方法
当使用本地事务时 (jdbc 事务)
需要在 hibernate.cfg.xml 文件的 <session-factory> 节点中添加
<property name= ”hibernate.current_session_context_class ”>thread</property>
当使用本地事务时 (jta 事务 )