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 将使用适当的替代模式(而不是扔出异常)。这一点可以确保应用程序的可移植性。
分享到:
相关推荐
《Hibernate4实战》这本书主要涵盖了Hibernate4框架在Java开发中的应用和高级技术,包括关系映射、事务管理、核心原理、性能优化以及二级缓存的使用。以下是对这些主题的详细解析: 1. **关系映射**:Hibernate是...
在第二部分中,《Hibernate4实战》详细讲解了Hibernate的配置过程。这包括`hibernate.cfg.xml`配置文件的解析,如何设置数据库连接信息(如驱动、URL、用户名和密码),以及如何定义日志级别和其他高级配置选项。...
第5章 继承和定制类型 5.1 映射类继承 5.1.1 每个带有隐式多态的具体类一张表 5.1.2 每个带有联合的具体类一张表 5.1.3 每个类层次结构一张表 5.1.4 每个子类一张表 5.1.5 混合继承策略 ...
- 异步操作与事务管理:学习如何在Hibernate中处理并发,以及事务的隔离级别和回滚规则。 4. **Day04:优化与实战** - 查询优化:探讨HQL和SQL的性能比较,以及如何优化查询效率。 - 绩效监控:了解Hibernate的...
4. Transaction:事务管理,处理并发控制和数据一致性问题。 5. Query/Criteria:查询接口,提供HQL(Hibernate查询语言)和Criteria API进行数据检索。 三、Hibernate工作流程 1. 加载配置:通过Configuration读取...
- 需要进行事务管理、数据访问和集成第三方系统的复杂项目。 #### 四、Hibernate框架 1. **定义**:Hibernate是一个开放源码的对象关系映射(ORM)框架,用于将Java对象映射到数据库表及其字段上。 2. **特点**:...
这部分内容包括了第四到第六部分,通常会讲解更深入的Hibernate应用和实战技巧。 在Part 04中,可能涉及以下知识点: 1. **SessionFactory与Session**:这部分会详细解析SessionFactory和Session的区别和作用,...
Spring4在这里主要作为应用上下文管理和IoC容器,整合其他组件,如Struts2和Hibernate4,提供事务管理以及AOP(面向切面编程)支持。 4. **EasyUI**:EasyUI是一个基于jQuery的UI库,为Web应用程序提供了丰富的组件...
5. **Session和Transaction管理**:讲解了Hibernate的Session接口和Transaction接口的使用,以及事务处理的最佳实践。 6. **查询语言HQL和 Criteria API**:深入探讨Hibernate Query Language(HQL)和Criteria API...
9. **事务管理**:讲解Hibernate如何支持事务,包括编程式事务管理和声明式事务管理,以及如何处理并发控制和事务隔离级别。 10. **性能优化**:提供性能调优的策略,如批处理操作、延迟加载控制、缓存策略调整、预...
**尚硅谷_佟刚_Hibernate课件.pptx** 这份课件很可能是课程的详细讲义,包含上述所有主题的讲解,可能还会有示例代码和实战案例,是你学习Hibernate的重要参考资料。 通过学习这个课程,你将能够熟练地在Java项目中...
**Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...
4. 事务处理:Hibernate支持JTA(Java Transaction API)和JDBC事务管理,确保数据操作的原子性和一致性。 5. 第二级缓存:通过集成如EhCache等缓存解决方案,提升应用性能。 四、实战应用 1. 配置:在项目中引入...
2. **事务管理**: 正确设置事务边界,避免脏读、不可重复读和幻读等并发问题。 3. **自定义服务**: 当标准服务无法满足需求时,可以编写自定义服务并将其注入到Service Register中。 4. **使用SessionFactory的最佳...
讲解如何开始和提交事务,处理并发和异常。 6. CRUD操作:展示如何使用Hibernate进行创建(Create)、读取(Read)、更新(Update)和删除(Delete)数据,包括HQL(Hibernate Query Language)和 Criteria API的...
5. **锁机制**:Hibernate支持两种类型的锁机制:悲观锁和乐观锁,它们分别用于解决并发问题的不同场景。 6. **分页**:当查询结果集较大时,可以使用分页技术来提高性能。 7. **缓存管理**:Hibernate支持一级...
事务的隔离级别和传播行为也是需要了解的重点,它们影响到并发操作的安全性。 **四、HQL与 Criteria 查询** hibernate提供了自己的查询语言HQL(Hibernate Query Language),它类似于SQL但面向对象。通过HQL,我们...
- Transaction:事务管理是数据库操作的关键,Hibernate提供了API来支持事务的开始、提交和回滚。 - Configuration:配置对象用于加载Hibernate的配置文件,初始化SessionFactory。 - SessionFactory:它是线程...
2. **第二级缓存**:可选的全局缓存,跨Session共享,提升性能,但需考虑并发和数据一致性问题。 3. **懒加载(Lazy Loading)**:只在真正需要时加载关联对象,降低内存占用。 4. **集合映射**:支持List、Set、Map...