版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Hibernate事务、并发和缓存管理、课程内容、Hibernate提交事务和撤销事务。Hibernate使用悲观锁和乐观锁来解决并发问题。休眠缓存管理,会话和事务范围,会话工厂是一个重量级的对象,创建一个会话工厂对象需要很多资源。通常,它只能在应用程序中创建一次,也就是说,当应用程序启动时,它是由配置的一个实例创建的。创建会话消耗的资源相对较少,但它不是线程安全的。对于单个请求、单个会话和单个工作单元,应该丢弃一次。只有在需要时,会话对象才会获得JDBC连接对象。因此,在不使用时,会话不会消耗任何资源。创建休眠会话时,我们应该注意以下问题:对于数据库链接,不要创建多个会话或事务。当对一个数据
2、库链接和一个事务使用多个会话时,您需要格外小心。会话对象将记录数据更新,因此另一个会话对象可能会遇到过期数据。会话不是线程安全的。切勿在两个并发线程中访问同一个会话。通常,一个会话只对应于一批需要完成一次的工序单元。交易是指一组相互依赖的操作行为,如网上购物或通过自动取款机进行银行转账。事务的成功取决于这组相互依赖的操作的成功执行。如果这些操作中的一个失败,就意味着整个事务失败。数据库事务的特性,数据库事务必须具有ACID特性:(1)A是原子的:它意味着整个数据库事务是一个不可分割的工作单元,并且一个事务只有在事务中的每个操作都成功执行后才能被认为是成功的。(2)C是一致性:它意味着数据库事务
3、不能破坏数据的完整性和业务逻辑的一致性。(3)I is isolation:在并发环境中,当不同的事务操作相同的数据时,它们应该有自己完整的数据空间。(4)D是持久性:它意味着只要事务成功运行,它对数据库的修改将被永久保存。事务边界是通过JDBC应用编程接口声明的。在JDBC应用编程接口中,连接类代表一个数据库连接,它提供了一些控制事务的方法。其具体功能如下:设置自动提交(boolean autocommit):设置是否自动提交事务。Commit():提交事务。回滚():撤消事务。下面的代码表示创建连接类:/加载数据库驱动程序类的实例。/设置连接数据库的网址、用户名和密码。字符串网址=JDBC
4、 : Microsoft : SQL server :/localhost :1433;databasename=pubs字符串dbUser=sa字符串db password=;/建立数据库连接连接cn=drivermanager.getconnection(网址、数据库用户、数据库密码);默认情况下,新创建的连接实例将采用自动提交事务模式。您也可以通过调用其setautocommit(布尔自动提交)方法来设置手动提交事务的模式,然后将几个用于更新数据的SQL语句作为一个事务。所有操作完成后,调用commit()提交事务。如果一条SQL语句无法执行,系统将抛出一个SQLException异常,
5、我们可以在捕获该异常的代码中调用rollback()方法来撤消事务。,连接cn=空;语句st=null。请尝试cn=DriverManager . GetConnection(URL、dbUser、db password);cn。设置自动提交(false);/设置手动交易提交模式ST=cn . CreateStatement();st.executeUpdate(更新帐户集余额=900,其中id=1);st.executeUpdate(更新帐户集余额=1100,其中id=2);麻省理工学院();/提交事务捕获(异常e)try cn . roll back();/撤消事务捕获(exception
6、ex) ex。printstacktrace();e . PrintStackTrace();最后尝试ST . close();cn . close();/关闭连接捕获(exceptionexc)exc . printstacktrace();通过Hibernate API声明事务边界,configuration conf=new configuration()。配置();会话工厂会话工厂=conf . buildsessionfactory();会话会话=会话工厂.打开会话();在Hibernate API中,会话和事务类提供了声明事务边界的方法。事务ts=session . Begin I
7、ntraNet Action();创建事务实例后,可以通过调用其commit()方法来提交事务,并在事务中的某个操作无法执行时调用rollback()来撤消事务。一个会话可以包含多个事务,也就是说,一个会话可以对应多个事务。Hibernate对JDBC进行了轻量级封装。尽管在应用程序中可以绕过Hibernate API,直接通过JDBC API声明事务,但这不利于跨平台开发。如下面的代码所示:为了解决事务的并发问题,对于同时运行的多个事务,当这些事务访问数据库中的相同数据时,如果不采用必要的隔离机制,将会导致各种并发问题。我们可以将这些并发问题归纳为两类:(1)事务发生在事务之后,影响事务发生
8、在事务之前。第一类是更新丢失:事务回滚后发生的事务包括之前成功提交的事务。脏读:事务的成功提交发生在覆盖前一个回滚事务之后。第二种类型的更新会丢失:后续事务的成功提交会覆盖先前成功提交的事务。(2)后续交易受到之前交易的影响。错误读取:后一个事务的数据统计不一致,因为前一个提交的事务在前后两次读取数据时已经被插入。不可重复读取:当后一个事务在前后两次读取相同的数据时,数据是不一致的,因为前一个提交的事务更新了数据。数据库锁的概念,数据库系统必须具有隔离所有并发运行的事务的能力,从而避免各种并发问题并保证数据的完整性和一致性。数据库系统使用锁来实现事务隔离。各种数据库中使用的锁的基本理论是相同的
9、,但是在具体的实现中有所不同。下面列出了锁的基本原则:(1)当事务访问某个数据库资源时,如果执行select语句,它必须首先获得共享锁,而当执行insert、update或delete语句时,它必须获得排他锁,该锁用于锁定被操作的资源。(2)当第二个事务也需要访问相同的资源时,如果执行select语句,必须首先获得共享锁。当执行插入、更新或删除语句时,还必须获得排他锁。此时,根据以下条件决定第二个事务是应该等待第一个事务解锁资源还是立即获得锁:如果在资源上没有放置锁,则第二个事务将在读取时立即获得共享锁,在更新时获得排他锁。如果在资源上放置共享锁,第二个事务将在读取时立即获得共享锁,并在更新时
10、等待第一个事务释放共享锁。如果在资源上放置了排它锁,则第二个事务在读取时等待第一个事务释放排它锁,在更新时等待第一个事务释放排它锁。共享锁用于读取数据。它是非独占的,允许其他事务同时读取其锁定的资源,但不允许其他事务更新它。共享锁具有以下特征:锁定条件:当一个事务执行select语句时,数据库系统将为该事务分配一个共享锁来锁定查询到的记录。解锁条件:读取后释放共享锁。兼容性:如果共享锁已经放在数据资源上,您也可以添加共享锁并更新锁。并发性能:具有良好的并发性能。当多个事务读取相同的数据时,每个事务将获得一个共享锁,因此它可以同时读取锁定的数据。(1)共享锁、排他锁也称为排他锁,在修改数据时使用
11、。对于它锁定的资源,其他事务既不能读取也不能更新。排他锁具有以下特征:锁定条件:当事务执行更新语句时,数据库系统将首先为事务分配更新锁。解锁条件:当数据被读取时,在更新操作期间,更新锁将被升级为排他锁。兼容性:与共享锁兼容。一个数据源可以有多个共享锁和一个更新锁。并发性:允许多个事务同时读取锁定的资源,并且不允许其他事务更新它。(3)排他锁,更新锁用于锁定更新操作初始化阶段可能修改的资源,以避免使用共享锁导致死锁。更新锁具有以下特征:(2)更新锁,锁定条件:当执行更新、删除和插入操作时,数据库系统将对数据资源使用排他锁。如果资源上已经存在其他锁,则不能放置排他锁。解锁条件:事务结束后才能释放排
12、他锁。兼容性:排他锁不能与其他锁兼容。并发性:并发性能差,并且只允许一个事务访问锁定的数据。采用悲观锁和乐观锁,在实现业务逻辑的过程中,往往需要保证数据访问的排他性。例如,在金融系统的日终结算处理中,我们希望在某个截止时间点处理数据,而不希望数据在结算过程中再次发生变化(可能是几秒钟或几个小时)。此时,需要一些机制来确保这些数据在某个操作过程中不会被外界修改。这种机制在这里也称为“锁定”,即锁定选定的目标数据,使其不能被其他程序修改。Hibernate支持两种锁定机制:悲观锁定和乐观锁定。悲观锁,悲观锁是指保持一种态度,保持数据被外界修改(包括系统当前的其他事务和来自外部系统的事务),使数据在
13、整个数据处理过程中被锁定。该语句锁定帐户表中满足检索条件(名称=Lily)的所有记录。在提交该交易之前(当提交交易时,交易过程中的锁将被释放),这些记录不能被外部世界修改。Hibernate的悲观锁也是基于数据库的锁机制实现的。从name=lily的帐户中选择*进行更新,锁定模式。无:没有锁定机制。锁定模式。写:Hibernate在插入和更新记录时会自动得到它。锁定模式。读取:Hibernate会在读取记录时自动获取记录。依赖于数据库调用的典型悲观锁是:而Hibernate的锁定模式是:Hibernate通常在内部使用上述三种锁定机制。例如,Hibernate将在保存方法的实现中自动向目标对象
14、添加写锁,以确保对象在更新过程中不会被外部世界修改。应用层通常使用以下两种锁定机制:锁定模式。升级:使用数据库的for update子句进行锁定。锁定模式。upgrade _ nowait:Oracle的一个具体实现,它使用Oracle的for update nowait子句来实现锁定功能。程序中的锁定通常通过以下方法实现:通过标准接口。Query.setLockMode():通过查询接口实现。会话锁():通过会话接口实现。注意:只有当在查询开始之前(也就是说,在Hibernate生成SQL之前)设置了锁定时,才会通过数据库的锁定机制来处理锁定。否则,数据是通过选择SQL而不是for upda
15、te子句加载的,因此无法锁定数据库。与悲观锁定相比,乐观锁定机制采用了更宽松的锁定机制。在大多数情况下,悲观锁是通过数据库的锁定机制来实现的,以保证最大程度的独占操作。然而,它带来了大量的数据库性能开销,特别是对于长事务,这通常是无法忍受的。Hibernate在其数据访问引擎中内置了乐观锁定实现。如果我们不需要考虑外部系统对数据库的更新操作,我们将通过使用Hibernate提供的透明乐观锁定大大提高我们的生产力。Hibernate可以由类描述符的最优性锁定属性结合版本描述符来指定。Hibernate缓存管理,缓存是计算机领域中一个非常常见的概念,它介于应用程序和持久数据存储源之间。Hibernate的会话缓存是一个存储相关Java对象的内存区域。这种位于会话缓存中的对象也称为持久对象,会话负责根据持久对象的状态变化同步更新数据库。会话缓存是内置的,无法卸载。会话缓存被称为Hibernate的一级缓
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业组织架构及岗位职责清单
- 配电室工作监护制度
- 2026年产品交付进度函9篇范本
- 听力检测的创新技术
- 创新项目创新点与需求分析模板
- 学术研究成果保护责任保证承诺书7篇范文
- 有关2026年海外参展计划的商洽(6篇)
- 护理研究方法与论文写作
- 研发产品质量保障承诺函范文3篇
- 林业可持续进步目标承诺书5篇
- CJJ-T 135-2009 (2023年版) 透水水泥混凝土路面技术规程
- 中建五局施工方案编制指南(2023年版)351-700
- 【部编版】三年级语文下册全册导学案
- (完整版)xx中学“双积双评”积分入团实施方案
- 西藏色拉寺导游词
- 2023国网蒙东电力有限公司招聘管理类《管理科学与工程》考试题库(含答案)
- 2023年重庆大学机械学院复试题重大机械复试真题
- CBCC中国建筑色卡色
- (完整版)简单儿童对比涂色画画-可打印(干货)
- GB/T 26480-2011阀门的检验和试验
- GB/T 21076-2017证券及相关金融工具国际证券识别编码体系
评论
0/150
提交评论