资源预览内容
第1页 / 共2页
第2页 / 共2页
亲,该文档总共2页全部预览完了,如果喜欢就下载吧!
资源描述
Hibernate一、一、Hibernate 的事务管理的事务管理Hibernate 是是 JDBC 的轻量级封装,本身并不具备事务管理能力,在事务管理层,的轻量级封装,本身并不具备事务管理能力,在事务管理层,Hibernate 将将其委托给底层的其委托给底层的 JDBC 或者或者 JTA,以实现事务的管理和调度。以实现事务的管理和调度。Hibernate 的默认事务处理机制基于的默认事务处理机制基于 JDBCTransaction,也可以通过配置文件设定采用,也可以通过配置文件设定采用 JTA 作为作为事务管理实现:事务管理实现:net.sf.hibernate.transaction.JTATransactionFactory1、基于、基于 JDBC 的事务管理的事务管理Hibernate 对于 JDBC 事务的封装非常简单。例如:session=sessionFactory.openSession();Transaction tx= session.beginTransaction();tx.commit();这里要注意的是,在 sessionFactory.openSession()中,Hibernate 会初始化数据库连接,与此同时,将其 AutoCommit 设为关闭状态,这就是说,从 SessionFactory 获得 session,其自动提交属性就已经被关闭了,下面的代码不会对事务性数据库产生任何效果。session=sessionFactory.openSession();session.save(user);session.close();如果要使得代码真正作用到数据库,必须显示的调用 Transaction 指令session=sessionFactory.openSession();Transaction tx = session.beginTransaction();session.save(user);tx.commit();session.close();2、基于、基于 JTA 的事务管理的事务管理JTA 提供了跨 Session 的事务管理能力,这是与 JDBCTransaction 最大的差异。JDBC 事务由 Connection 管理,也就是说,事务管理实际上是在 JDBC Connection 中实现,事务周期限于 Connection 的生命周期之内,对于基于 JDBC Transaction 的 Hibernate 事务管理机制,事务管理在 Session 所依托的 JDBC Connection 中实现,事务周期限于 Session 的生命周期。JTA 事务管理由 JTA 容器实现,JTA 容器对当前加入事务的众多 Connection 进行调度,实现其事务性要求,JTA 的事务周期可横跨多个 JDBC Connection 生命周期,同样,对基于 JTA 事务的Hibernate,JTA 事务横跨多个 Session。需要注意的是,参与 JTA 事务的 Connection 需避免对事务管理进行干涉,如果采用 JTA Transaction,就不应该再调用 Hibernate 的 Transaction 功能。一、锁机制一、锁机制在业务逻辑的实现过程中,往往需要保证数据访问的排他性,给我们选定的目标数据上锁,使其无法在业务逻辑的实现过程中,往往需要保证数据访问的排他性,给我们选定的目标数据上锁,使其无法被其它程序修改。被其它程序修改。Hibernate 支持两种锁机制:悲观锁支持两种锁机制:悲观锁(Pessimistic Locking)和乐观锁和乐观锁(Optimistic Locking) 。1、悲观锁、悲观锁(Pessimistic Locking)悲观锁悲观锁指的是对数据被外界(包括本系统当前的其它事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定的状态。悲观锁悲观锁的实现,往往依靠数据库提供的锁机制往往依靠数据库提供的锁机制。Hibernate 的加锁模式有:LockMode.NONE : 无锁机制。LockMode.WRITE :Hibernate 在 Insert 和 Update 记录的时候会自动获取。LockMode.READ : Hibernate 在读取记录的时候会自动获取。以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。LockMode.UPGRADE :利用数据库的 for update 子句加锁。LockMode. UPGRADE_NOWAIT :Oracle 的特定实现,利用 Oracle 的 forupdate nowait 子句实现加锁。实现:实现:Criteria.setLockModeQuery.setLockModeSession.lock2、乐观锁、乐观锁(Optimistic Locking)相对悲观锁而言,乐观锁机制采取了更加宽松的机制,乐观锁机制避免了长事务中的数据库加锁开销。相对悲观锁而言,乐观锁机制采取了更加宽松的机制,乐观锁机制避免了长事务中的数据库加锁开销。Hibernate 在其数据访问引擎中内置了乐观锁实现。乐观锁,大多是基于数据版本(在其数据访问引擎中内置了乐观锁实现。乐观锁,大多是基于数据版本(Version)记录机制实现)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号