锁
业务逻辑的实现过程中,往往需要保证数据访问的排他性,也就是说,我们需要一些机制来保证选取的数据在使用过程中不会被外界修改,这样的机制,就是“锁”,即给我们选定的目标数据上锁,使其无法被其它程序来修改。
(1),悲观锁---依靠数据库层提供的锁机制。
String hqlStr = "from TUser as
user where user.name=‘Erica‘";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE);//加锁(for update)
List userList =
query.list();//执行查询,获取数据
query.setLockMode对查询语句中,特定别名(user)所对应的记录进行加锁。
Hibernate的加锁模式(Hibernate内部使用)有:
LockMode.NONE:无锁机制
LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取。
LockMode.READ:Hibernate在读取记录的时候会自动获取。
依赖数据库的悲观锁机制(应用层):
LockMode.UPGRADE:利用数据库的for update子句加锁。
LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现加锁。
注意:应该查询开始之前设定加锁。
悲观锁的缺点:依赖数据库的锁机制,以保证操作最大程度上的独占性,但导致数据库性能的巨大开销,特别是长事务。
(2),乐观锁
---大多是基于数据版本记录机制实现。
数据版本:即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。
乐观锁策略:提交版本必须大于记录当前版本才能执行更新。
添加一个Version属性描述符
<hibernate-mapping>
<class name="TUser" table="T_USER" dynamic-update="true"
dynamic-insert="true" optimistic-lock="version">
<id></id>
<version column="version" name="version"
type="java.lang.Integer"/>
</class>
</hibernate-mapping>
注意:version节点必须出现在ID节点之后。
违反乐观锁策略时:tx.commit()处抛出StaleObjectStateException异常,并指出版本检查失败,当前事务正在试图提交一个过期数据。
通过捕捉这个异常,我们就可以在乐观锁校验失败时进行相应处理。
分享到:
相关推荐
Hibernate 锁机制_悲观锁和乐观锁 Hibernate 锁机制是指在数据库访问中,为了维护数据的一致性和正确性,所采取的一些机制来防止数据的并发访问和修改。 Hibernate 中有两种锁机制:悲观锁和乐观锁。 一、悲观锁...
4. ** Hibernate锁的使用** - `Session.lock()`: 将对象锁定在指定的锁模式下。 - `Query.setLockMode()`: 对查询结果应用锁模式。 - `Criteria.setLockMode()`: 同上,针对Criteria查询。 5. **实验情况** - ...
### Hibernate的乐观锁和悲观锁 #### 一、引言 在软件开发中,尤其是在涉及大量并发操作的应用场景下,确保数据的一致性和完整性是非常重要的。对于基于Java Web的应用而言,Hibernate作为一款流行的ORM框架,提供...
Hibernate锁的基本机制!主要是针对Hiberante乐观锁悲观锁的介绍以及相对应的数据库本身的处理机制,包括和SPRING相结合部分的锁处理机制
【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...
在进行Hibernate的测试时,可以创建一个名为`hibernate_test`的项目,编写对应的实体类、映射文件以及测试用例,模拟并发场景,来深入理解并对比悲观锁和乐观锁的差异和效果。 总之,理解并合理运用悲观锁和乐观锁...
本文主要讨论的是Hibernate框架中两种锁机制的使用:乐观锁和悲观锁。 首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它...
### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...
Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以在读取数据时不会进行任何锁定,而在更新数据时才会检查在此期间是否有其他用户...
Hibernate 简介 Hibernate 开发流程 Hibernate 配置文件 Hibernate 核心接口和类 Hibernate ORM映射 HQL Hibernate 懒加载机制与抓取策略 Hibernate 缓存 Hibernate 锁机制
《Hibernate 悲观锁与乐观锁详解》 在多用户并发访问的环境中,数据库管理系统必须具备有效的数据访问控制机制,以确保数据的一致性和完整性。Hibernate,作为一款流行的Java持久化框架,提供了两种主要的锁定策略...
在《hibernate_3200_Concurrency_Pessimistic_Lock》这个压缩包中,很可能包含了关于Hibernate框架如何实现悲观锁和乐观锁的详细资料,包括源代码示例、配置方法和使用场景。通过学习这些资料,你可以深入了解这两种...
在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...
在Hibernate中,乐观锁的处理主要在`org.hibernate.event.internal.DefaultMergeEventListener`和`org.hibernate.event.internal.DefaultUpdateEventListener`这两个事件监听器中完成。当调用`Session.merge()`或`...
标题中的“Hibernate 乐观和悲观锁”涉及到的是Java领域中持久化框架Hibernate中的一种数据并发控制策略。在多线程环境下,为了保证数据的一致性和完整性,数据库管理系统提供了多种锁定机制,其中乐观锁和悲观锁是...
该资源主要是分析:乐观锁解决事务并发.乐观锁校验测试, 基于hiber管理的悲观锁实现
以上只是Hibernate众多知识点的一部分,实际面试中可能涉及更多细节,如级联操作、事务隔离级别、延迟加载机制、乐观锁和悲观锁的区别等。熟悉并理解这些内容对于通过Hibernate相关的面试至关重要。