Hibernate事务处理.ppt_第1页
Hibernate事务处理.ppt_第2页
Hibernate事务处理.ppt_第3页
Hibernate事务处理.ppt_第4页
Hibernate事务处理.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

开源O/R映射框架 v数据库事务介绍 事务的定义 事务的ACID属性 v数据库事务声明 通过Hibernate声明JDBC事务 通过Hibernate声明JTA事务 v并发控制 多个事务并发引起的问题 事务隔离级别 在应用程序中解决不可重复读问题 乐观锁(Optimistic Locking) 悲观锁(Pessimistic Locking) Java高端培训2 事务是指一组相互信赖的操作行为。这些操作 要么必须全部成功,要么必须全部失败,以保 证数据的一致性和完整性。 数据库事务是对现实生活中事务的模拟,它由 一组在业务逻辑上相互信赖的SQL语句组成。 示例:银行转帐操作。 Java高端培训3 ACID: 原子性(Atomic): 指整个数据库事务是不可分割的工作单元。原子性确保在事务中 的所有操作要么都发生,要么都不发生。 一致性(Consistency): 一旦一个事务结束了(不管成功与否),系统所处的状态和它的业 务规则是一致的。即数据应当不会被破坏。 隔离性(Isolation): 指多个事务同时操作同一数据时,每个事务都有各自的完整数据 空间。 持久性(Durability): 一旦事务完成,事务的结果应该持久化。 Java高端培训4 v数据库事务声明 Java高端培训5 数据库系统的客户程序只要向数据库系统声明了一 个事务,数据库系统就会自动保证事务的ACID特性 。 声明事务包含: 事务的开始边界:开始事务。 事务的正常结束边界:提交事务。 事务的异常结束边界:回滚事务。 数据库系统支持两种事务模式: 自动提交事务(隐式事务): 每个SQL语句都是一个独立 的事务,当数据库系统执行完一条SQL语句后,会自动 提交事务。 手工提交事务(显式事务):必须由数据库系统的客户程 序显式指定事务开始边界和结束边界。 Java高端培训6 Java高端培训7 Connection con = null; PreparedStatement pstmt = null; try con = DriverManager.getConnection(dbUrl, username, password); /设置手工提交事务模式 con.setAutoCommit(false); pstmt = ; pstmt.executeUpdate(); /提交事务 mit(); catch(Exception e) /事务回滚 con.rollback(); finally . Hibernate本身在设计时并不具备事务处理功能 Hibernate只是将底层的JDBCTransaction或者 JTATransaction进行了一下封装,在外面套上 Transaction和Session的外壳,其实底层都是通 过委托底层的JDBC或JTA来实现事务的调度功 能。 Java高端培训8 如果Hibernat持久层运行在一个非托管环境中 ,可以在hibernate配置文件中指定使用的是 JDBC事务。 注:如果不进行配置,Hibernate也会默认使用 JDBC事务。 Java高端培训9 org.hibernate.transaction.JDBCTransactionFactory hibernate.cfg.xml Transaction tx = null; try tx = session.beginTransaction(); / do some work. mit(); catch (RuntimeException e) if (tx != null) tx.rollback(); throw e; / or display error message finally session.close(); 不管事务成功与否,最后都应该调用Session的 close()方法来关闭Session。 即使事务中只包含只读操作,也应该在事务执 行成功后提交事务,并且在事务执行失败时撤 销事务。 因为在提交或撤销事务时,数据库会释放事务所占 用的资源,有利于提高数据库的运行性能。 一个Session可以包含多个Transaction实例,也 就是说,一个Session可以对应多个事务。 如果在执行Session的一个事务时出现了异常, 就必须立即关闭这个Session,不能再利用这个 Session来执行其他的事务。 Java高端培训10 Hibernat持久层运行在一个托管环境中,可以 使用JTA Java高端培训11 org.hibernate.transaction.JTATransactionFactory / BMT(bean管理事务) UserTransaction tx = null; try tx = (UserTransaction)new InitialContext().lookup(“java:comp/UserTransaction“); tx.begin(); / Do some work on Session bound to transaction factory.getCurrentSession().persist(.); mit(); catch (RuntimeException e) tx.rollback(); throw e; / or display error message hibernate.cfg.xml 注:在CMT(容器管理事务) 方式下,事务声明是在 session bean的部署描述符 中,而不需要编程。 v并发控制 多个事务并发引起的问题 事务隔离级别 在应用程序中解决不可重复读问题 乐观锁(Optimistic Locking) 悲观锁(Pessimistic Locking) Java高端培训12 多个事务同时访问数据库中相同的数据时,如 果没有采取必要的隔离机制,就可能会发生如 下并发问题: 第一类丢失更新:撤消一个事务时,把其它事务已 提交的更新数据也撤消了。 脏读:一个事务读到另一个事务未提交的更新数据 。 不可重复读:一个事务读到另一个事务已经提交的 更改数据。 第二类丢失更新:一个事务覆盖另一个事务已经提 交的更新数据。 幻读:一个事务读到另一个事务已提交的新增或已 删除数据。 Java高端培训13 为了解决多个事务并发会引发的问题,让用户根据 需要在事务的隔离性和并发性之间做合理的权衡, 数据库系统提供了四种事务隔离级别供用户选择: Read Uncommitted(读未提交数据):它可以防止第 一类丢失更新问题,但没有解决脏读以上的并发问题。 它的事务隔离性最低。 Read Committed(读已提交数据):它可以防止脏读以 下的并发问题,但没有解决不可重复读以上的并发问题 。 Repeatable Read(可重复读):它可以防止不可重复 读(包括第二类丢失更新)以下的并发问题,但没有解 决幻读问题。 Serializable(串行化):提供最严格的事务隔离性。它 把事务隔离成连续的一个接一个地执行,而不是并发执 行。在这种隔离级别下,不会出现任何的并发问题。 Java高端培训14 隔离级别越高,越能保证数据的完整性和一致 性,但对并发性能的影响也越大。 对于多数应用,可能优先考虑把数据库系统的 隔离级别设为Read Committed,它能够避免脏 读,而且具有较好的并发性能。 Java高端培训15 隔离级别是否会出现第 一类丢失更新 是否会出 现脏读 是否会出现 不可重复读 是否会出现第 二类丢失更新 是否会出 现幻读 Serializable否否否否否 Repeatable Read否否否否是 Read Committed否否是是是 Read Uncommitted否是是是是 每个数据库连接都有一个全局变量 tx_isolation表示当前的事务隔离级别。 JDBC使用数据库系统默认的隔离级别。 在非托管环境下: Hibernate配置文件中可以显示地设置隔离级别。 每一种隔离级别对应着一个正整数: Read Uncommitted: 1 Read Committed: 2 Repeatable Read: 4 Serializable: 8 在hibernate配置文件中设置隔离级别方式: Java高端培训16 2 在受管理环境中,如果Hibernate使用的数据库 连接来自于应用服务器提供的数据源, Hibernate不会改变这些连接的事务隔离级别。 这种情况下,应该通过修改应用服务器的数据 源配置来修改隔离级别。 Java高端培训17 当数据库系统采用Red Committed隔离级别时 ,会导致不可重复读和第二类丢失更新的并发 问题。在可能出现这种问题的场合,可以在应 用程序中采用乐观锁或悲观锁来避免这类问题 。 Java高端培训18 乐观锁假定当前事务操纵数据资源时,不会有 其他事务同时访问该数据资源,因此不作数据 库层次上的锁定。 为了维护正确的数据,乐观锁使用应用程序上 的版本控制(由程序逻辑来实现的)来避免可能 出现的并发问题。 唯一能够同时保持高并发和高可伸缩性的方法 就是使用带版本化的乐观并发控制。 版本检查使用版本号()或者时间戳 ()来检测更新冲突并防止更新丢 失。 Java高端培训19 原理: 在数据库表中加入一个version(版本)字段,在读取数据时连同版 本号一起读取。 在更新数据时先比较新数据的版本号与数据库表中的版本号: 如果等于数据库表中的版本号则予以更新,并递增版本号。 如果小于数据库表中的版本号就抛出异常。 Hibernate在其数据库访问引擎中内置了乐观锁定实现,默认 也是选择version方式作为Hibernate乐观锁定实现机制。 步骤: 在持久化类中定义一个代表版本号的属性。类型:long, integer, short 在对象关系映射文件中用标记来建立持久化类的version 属性与表中version字段的映射,一定要定义在元素后面。 完成以上两个步骤后,在配置文件及程序中就无须作其它设置, 按往常一样写操作代码就可以了。 Java高端培训20 Java高端培训21 public class Product implements java.io.Serializable private Long id ; private int version; /版本号 private String name; /产品名 private String description; /描述-简介 private Double unitCost; /单价 private Date pubTime; /生产日期 . Product.java Product.hbm.xml 使用时间戳()也可以完成乐观锁 定机制,但不是特别安全的实现。用法跟版本 检查相似。 由于乐观锁定是使用系统中的程序来控制,而 不是使用数据库中的锁定机制,因而如果有人 故意自行更新版本信息来越过检查,则锁定机 制就无效。所以建议把持久化类中的version属 性的set方法设置为private的。 Java高端培训22 悲观锁假定当前事务操纵数据资源时,肯定还会有 其他事务同时访问该数据资源,为了避免当前事务 的操作受到干扰,先锁定资源。 悲观锁的一般实现方式是: 在应用程序中显式采用数据库系统的独占锁来锁定数据 资源。在如下几种方式时可能显示指定锁定模式为 LockMode.UPGRADE: 调用Session的get()或load()时 调用Session的lock()方法时 调用Query的setLockMode()方法 它会生成 select for update 这样的语句来显示指定采 用独占锁来锁定查询的记录。 尽管悲观锁能够防止丢失更新和不可重复读这类并 发问题,但是它影响并发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论