`

Hibernate4实战 之第五部分:Hibernate的事务和并发

 
阅读更多

Hibernate本身没有事务的实现
Hibernate 直接使用 JDBC 连接和 JTA 资源,不添加任何附加锁定行为。也就是说你在Hibernate里面使用的事务要么是JDBC的事务,要么是JTA的事务。
Hibernate不锁定内存中的对象
你的应用程序会按照你的数据库事务的隔离级别规定的那样运作,真正对事务的实现和支持也依赖于数据库。
 
对于并发处理,Hibernate提供了乐观锁和悲观锁来进行并发处理
Hibernate对自动乐观并发控制提供版本管理,针对行级悲观锁定,Hibernate 也提供了辅助的(较小的)API,它使用了 SELECT FOR UPDATE 的 SQL 语法
Hibernate的Session是和事务联系在一起的
可以通过Session去获取事务的接口,从而进行事务的控制。
 
数据库事务应该尽可能的短
这样能降低数据库中的锁争用。数据库长事务会阻止你的应用程序扩展到高的并发负载。因此,假若在用户思考期间让数据库事务开着,直到整个工作单元完成才关闭这个事务,这绝不是一个好的设计。
这就引出一个问题:一个操作单元,也就是一个事务单元的范围应该是多大?
一个操作一个?一个请求一个?一个应用一个?
 
反模式:session-per-operation
在单个线程中, 不要因为一次简单的数据库调用,就打开和关闭一次 Session!数据库事务也是如此。也就是说应该禁止自动事务提交(auto-commit)。
 
session-per-request
最常用的模式是 每个请求一个会话。 在这种模式下,来自客户端的请求被发送到服务器端,即 Hibernate 持久化层运行的地方,一个新的 Hibernate Session 被打开,并且执行这个操作单元中所有的数据库操作。一旦操作完成(同时对客户端的响应也准备就绪),session 被同步,然后关闭。会话和请求之间的关系是一对一的关系。
Hibernate 内置了对“当前 session(current session)” 的管理,用于简化此模式。你要做的一切就是在服务器端要处理请求的时候,开启事务,在响应发送给客户之前结束事务,通常使用Servelt Filter来完成。
 
非托管环境下
所谓非托管,指的是:应用程序没有托管到J2EE环境中,通常由Hibernate自己来负责管理数据库连接池。应用程序开发人员必须手工设置事务声明,换句话说,就是手工启动,提交,或者回滚数据库事务。
 
使用JTA
又有两种方式,一种是在Hibernate配置里面修改transaction的factory类,从而在程序里面可以直接使用Hibernate的事务API,也就是程序不用变化。
另外一种方式就是直接通过JNDI去查找UserTransaction,然后直接在程序里面使用JTA的接口来控制事务。
应用程序级别的版本检查
简单点说,就是由应用程序自己实现版本检查来确保对话事务的隔离,从数据访问的角度来说是最低效的,不推荐使用。
 
扩展周期的session和自动版本化
Hibernate 使用扩展周期的 Session 的方式,或者脱管对象实例的方式来提供自动版本检查。单个 Session 实例和它所关联的所有持久化对象实例都被用于整个对话,这被称为 sessionper-
conversation。
Hibernate 在同步的时候进行对象实例的版本检查,如果检测到并发修改则抛出异常。由开发人员来决定是否需要捕获和处理这个异常(通常的抉择是给用户 提供一个合并更改,或者在无脏数据情况下重新进行业务对话的机会)。
在等待用户交互的时候, Session 断开底层的 JDBC 连接。这种方式以数据库访问的角度来说是最高效的方式。应用程序不需要关心版本检查或脱管对象实例的重新关联,在每个数据库事务中,应用程序也不需要载入读取对象实例。
应用程序级别的版本检查
简单点说,就是由应用程序自己实现版本检查来确保对话事务的隔离,从数据访问的角度来说是最低效的,不推荐使用。
 
扩展周期的session和自动版本化
Hibernate 使用扩展周期的 Session 的方式,或者脱管对象实例的方式来提供自动版本检查。单个 Session 实例和它所关联的所有持久化对象实例都被用于整个对话,这被称为 sessionper-conversation。
Hibernate 在同步的时候进行对象实例的版本检查,如果检测到并发修改则抛出异常。由开发人员来决定是否需要捕获和处理这个异常(通常的抉择是给用户 提供一个合并更改,或者在无脏数据情况下重新进行业务对话的机会)。
在等待用户交互的时候, Session 断开底层的 JDBC 连接。这种方式以数据库访问的角度来说是最高效的方式。应用程序不需要关心版本检查或脱管对象实例的重新关联,在每个数据库事务中,应用程序也不需要载入读取对象实例。
通常不需要自己去管理锁定策略
Hibernate 总是使用数据库的锁定机制,从不在内存中锁定对象。因而用户并不需要花很多精力去担心锁定策略的问题。通常情况下,只要为 JDBC 连接指定一下隔离级别,然后让数据库去搞定一切就够了。
然而,高级用户有时候希望进行一个排它的悲观锁定,或者在一个新的事务启动的时候,重新进行锁定。
 
类 LockMode 定义了Hibernate 所需的不同的锁定级别
1:当更新或者插入一行记录的时候,锁定级别自动设置为LockMode.WRITE。
2:当用户显式的使用数据库支持的 SQL 格式 SELECT ... FOR UPDATE 发送 SQL 的时候,锁定级别设置为 LockMode.UPGRADE。
3:当用户显式的使用 Oracle 数据库的 SQL 语句 SELECT ... FOR UPDATE NOWAIT 的时候,锁定级别设置 LockMode.UPGRADE_NOWAIT。
4:当 Hibernate 在“可重复读”或者是“序列化”数据库隔离级别下读取数据的时候,锁定模式自动设置为 LockMode.READ。这种模式也可以通过用户显式指定进行设置。
5:LockMode.NONE 代表无需锁定。在 Transaction 结束时, 所有的对象都切换到该模式上来。与session 相关联的对象通过调用 update() 或者 saveOrUpdate() 脱离该模式。
 
显示的指定锁定模式
1:调用 Session.load() 的时候指定锁定模式(LockMode)。
2:调用 Session.lock()。
3:调用 Query.setLockMode()。
显示指定锁定模式的说明
1:如果在 UPGRADE 或者 UPGRADE_NOWAIT 锁定模式下调用 Session.load(),并且要读取的对象尚未被session 载入过,那么对象通过 SELECT ... FOR UPDATE 这样的 SQL 语句被载入。如果为一个对象调用 load() 方法时,该对象已经在另一个较少限制的锁定模式下被载入了,那么 Hibernate 就对该对象调用 lock() 方法。
2:如果指定的锁定模式是 READ,UPGRADE 或 UPGRADE_NOWAIT,那么 Session.lock() 就执行版本号检查。(在 UPGRADE 或者 UPGRADE_NOWAIT 锁定模式下,执行 SELECT ... FOR UPDATE这样的SQL语句。)
3:如果数据库不支持用户设置的锁定模式,Hibernate 将使用适当的替代模式(而不是扔出异常)。这一点可以确保应用程序的可移植性。
 
 原创内容 转自请注明【 http://sishuok.com/forum/blogPost/list/2481.html#7178
 视频配套PPT,视频地址【 Hibernate4实战-独家视频课程 】
2
6
分享到:
评论

相关推荐

    Hibernate4实战(pdf_source).

    《Hibernate4实战》这本书主要涵盖了Hibernate4框架在Java开发中的应用和高级技术,包括关系映射、事务管理、核心原理、性能优化以及二级缓存的使用。以下是对这些主题的详细解析: 1. **关系映射**:Hibernate是...

    Hibernate4实战

    在第二部分中,《Hibernate4实战》详细讲解了Hibernate的配置过程。这包括`hibernate.cfg.xml`配置文件的解析,如何设置数据库连接信息(如驱动、URL、用户名和密码),以及如何定义日志级别和其他高级配置选项。...

    Hibernate实战(第2版 中文高清版)

     第5章 继承和定制类型   5.1 映射类继承   5.1.1 每个带有隐式多态的具体类一张表   5.1.2 每个带有联合的具体类一张表   5.1.3 每个类层次结构一张表   5.1.4 每个子类一张表   5.1.5 混合继承策略 ...

    传智播客-hibernate框架开发视频第day01-day04资料

    - 异步操作与事务管理:学习如何在Hibernate中处理并发,以及事务的隔离级别和回滚规则。 4. **Day04:优化与实战** - 查询优化:探讨HQL和SQL的性能比较,以及如何优化查询效率。 - 绩效监控:了解Hibernate的...

    Hibernate hibernate

    4. Transaction:事务管理,处理并发控制和数据一致性问题。 5. Query/Criteria:查询接口,提供HQL(Hibernate查询语言)和Criteria API进行数据检索。 三、Hibernate工作流程 1. 加载配置:通过Configuration读取...

    轻量级Java EE企业应用实战 (第4版) Struts 2+Spring 4+Hibernate整合开发

    - 需要进行事务管理、数据访问和集成第三方系统的复杂项目。 #### 四、Hibernate框架 1. **定义**:Hibernate是一个开放源码的对象关系映射(ORM)框架,用于将Java对象映射到数据库表及其字段上。 2. **特点**:...

    Hibernate程序高手秘笈.part04-06.rar

    这部分内容包括了第四到第六部分,通常会讲解更深入的Hibernate应用和实战技巧。 在Part 04中,可能涉及以下知识点: 1. **SessionFactory与Session**:这部分会详细解析SessionFactory和Session的区别和作用,...

    基于Struts2+Hibernate4+Spring4+EasyUI+MySQL的网上商城项目实战源码

    Spring4在这里主要作为应用上下文管理和IoC容器,整合其他组件,如Struts2和Hibernate4,提供事务管理以及AOP(面向切面编程)支持。 4. **EasyUI**:EasyUI是一个基于jQuery的UI库,为Web应用程序提供了丰富的组件...

    hibernate 电子书全集

    5. **Session和Transaction管理**:讲解了Hibernate的Session接口和Transaction接口的使用,以及事务处理的最佳实践。 6. **查询语言HQL和 Criteria API**:深入探讨Hibernate Query Language(HQL)和Criteria API...

    Hibernate技术手册

    9. **事务管理**:讲解Hibernate如何支持事务,包括编程式事务管理和声明式事务管理,以及如何处理并发控制和事务隔离级别。 10. **性能优化**:提供性能调优的策略,如批处理操作、延迟加载控制、缓存策略调整、预...

    Hibernate课程

    **尚硅谷_佟刚_Hibernate课件.pptx** 这份课件很可能是课程的详细讲义,包含上述所有主题的讲解,可能还会有示例代码和实战案例,是你学习Hibernate的重要参考资料。 通过学习这个课程,你将能够熟练地在Java项目中...

    hibernate学习笔记,学习大纲【吐血推荐】

    **Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...

    hibernate-release-5.3.12.Final.zip

    4. 事务处理:Hibernate支持JTA(Java Transaction API)和JDBC事务管理,确保数据操作的原子性和一致性。 5. 第二级缓存:通过集成如EhCache等缓存解决方案,提升应用性能。 四、实战应用 1. 配置:在项目中引入...

    Hibernate Service Register机制初体验

    2. **事务管理**: 正确设置事务边界,避免脏读、不可重复读和幻读等并发问题。 3. **自定义服务**: 当标准服务无法满足需求时,可以编写自定义服务并将其注入到Service Register中。 4. **使用SessionFactory的最佳...

    Hibernate开发指南_夏昕

    讲解如何开始和提交事务,处理并发和异常。 6. CRUD操作:展示如何使用Hibernate进行创建(Create)、读取(Read)、更新(Update)和删除(Delete)数据,包括HQL(Hibernate Query Language)和 Criteria API的...

    Hibernate开发指南.pdf

    5. **锁机制**:Hibernate支持两种类型的锁机制:悲观锁和乐观锁,它们分别用于解决并发问题的不同场景。 6. **分页**:当查询结果集较大时,可以使用分页技术来提高性能。 7. **缓存管理**:Hibernate支持一级...

    hibernate培训第三天

    事务的隔离级别和传播行为也是需要了解的重点,它们影响到并发操作的安全性。 **四、HQL与 Criteria 查询** hibernate提供了自己的查询语言HQL(Hibernate Query Language),它类似于SQL但面向对象。通过HQL,我们...

    HIbernate基础知识积累

    - Transaction:事务管理是数据库操作的关键,Hibernate提供了API来支持事务的开始、提交和回滚。 - Configuration:配置对象用于加载Hibernate的配置文件,初始化SessionFactory。 - SessionFactory:它是线程...

    使用Hibernate 开发教程

    2. **第二级缓存**:可选的全局缓存,跨Session共享,提升性能,但需考虑并发和数据一致性问题。 3. **懒加载(Lazy Loading)**:只在真正需要时加载关联对象,降低内存占用。 4. **集合映射**:支持List、Set、Map...

Global site tag (gtag.js) - Google Analytics