hibernate中经常用到当多个人对同一数据同时进行修改的时候,会发生脏数据,造成数据的不一致性,解决办法是可以通过悲观锁和乐观锁来实现。
悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改,
优点:数据的一致性保持得很好,缺点:不适合多个用户并发访问,依赖于数据库锁机制,
当一个锁住的资源不被释放掉的时候,这个资源永远不会被其他用户进行修改,容易造成无限期的等待。
乐观锁:来源于状态维护,通过对数据的状态列数据进行维持来实现。 在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。
优点:对数据库无锁机制要求,能支持大并发数据,对长事务支持好。 缺点:因为乐观锁基于数据状态维持的,故对于系统有业务上的要求,有一定的局限性。
乐观锁实现:
<hibernate-mapping package="com.chinahometex.b2b.cms.entity.main">
<class name="CmsGroup" table="jc_group" dynamic-insert="true" optimistic-lock="version"> <!-- 打开乐观锁,确定使用版本类型乐观锁-->
<meta attribute="sync-DAO">false</meta>
<cache usage="read-write"/>
<id name="id" type="java.lang.Integer" column="group_id"><generator class="identity"/></id>
<version name="version" column="version" ></version> <!-- 使用乐观锁的列 -->
<property name="name" column="group_name" type="string" not-null="true" length="100" />
<property name="priority" column="priority" type="integer" not-null="true" length="10"/>
<property name="allowPerDay" column="allow_per_day" type="integer" not-null="true" length="10"/>
<property name="allowMaxFile" column="allow_max_file" type="integer" not-null="true" length="10"/>
<property name="allowSuffix" column="allow_suffix" type="string" not-null="false" length="255"/>
<property name="needCaptcha" column="need_captcha" type="java.lang.Boolean" not-null="true"/>
<property name="needCheck" column="need_check" type="java.lang.Boolean" not-null="true"/>
<property name="regDef" column="is_reg_def" type="java.lang.Boolean" not-null="true"/>
<set name="viewChannels" table="jc_chnl_group_view" inverse="true">
<cache usage="read-write"/>
<key column="group_id"/>
<many-to-many column="channel_id" class="Channel"/>
</set>
<set name="contriChannels" table="jc_chnl_group_contri" inverse="true">
<cache usage="read-write"/>
<key column="group_id"/>
<many-to-many column="channel_id" class="Channel"/>
</set>
<property name="jobPreSum" column="n_jobpersum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="jobSum" column="n_jobsum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="buyPreSum" column="n_buypersum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="buySum" column="n_buysum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="supplyPreSum" column="n_supplypersum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="supplySum" column="n_supplysum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="proxyPreSum" column="n_proxypersum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="proxySum" column="n_proxysum" type="java.lang.Integer" not-null="false" length="10"/>
<property name="logoPath" column="s_logo" type="java.lang.String" not-null="false" />
</class>
</hibernate-mapping>
悲观锁实现:
session.load(CmsGroup.class,1,LockMode.UPDATE);
或
Query query = sessoion.createQuery(hsql);
query.setLockMode(LockMode.UPGRAND);
悲观锁策略:
1. LockMode.NONE:无锁机制
2. LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取
3. LockMode.READ:Hibernate在读取记录的时候会自动获取
4. LockMode.UPGRADE:利用数据库的for update子句加锁
5. LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现加锁
乐观锁策略:
1. none:无乐观锁
2. version:通过版本机制实现乐观锁
3. dirty:通过检查发生变动过的属性实现乐观锁
4. all:通过检查所有
分享到:
相关推荐
在Hibernate源码中,乐观锁的实现主要依赖于`AbstractEntityPersister`类的`checkOptimisticLocking()`方法,它会比较当前对象的版本信息与数据库中的版本信息,如果不同则抛出`StaleObjectStateException`异常。...
### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...
【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...
在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...
在Hibernate中,可以使用`@Version`注解来实现乐观锁,该注解会在实体类的一个属性上添加版本字段,每次更新时,Hibernate会比较当前版本号和数据库中的版本号,如果不同,则认为有并发冲突,更新失败。乐观锁的优点...
《Hibernate 悲观锁与乐观锁详解》 在多用户并发访问的环境中,数据库管理系统必须具备有效的数据访问控制机制,以确保数据的一致性和完整性。Hibernate,作为一款流行的Java持久化框架,提供了两种主要的锁定策略...
本文主要讨论的是Hibernate框架中两种锁机制的使用:乐观锁和悲观锁。 首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它...
### Hibernate的乐观锁和悲观锁 #### 一、引言 在软件开发中,尤其是在涉及大量并发操作的应用场景下,确保数据的一致性和完整性是非常重要的。对于基于Java Web的应用而言,Hibernate作为一款流行的ORM框架,提供...
Hibernate 中有两种锁机制:悲观锁和乐观锁。 一、悲观锁(Pessimistic Locking) 悲观锁是一种预防并发访问的机制,Hibernate 通过对数据库的锁定来实现。悲观锁假定任何时刻存取数据时,都可能有另一个客户也...
### Java中的悲观锁与乐观锁实现详解 #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将...
在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 Hibernate 的隔离机制和锁机制。 Hibernate 的隔离机制 Hibernate 的隔离机制是基于数据库的事务隔离级别的。 Hibernate 提供了四种...
标题中的“Hibernate 乐观和...总的来说,掌握Hibernate的乐观锁和悲观锁是Java开发中的一项重要技能,它关乎到并发环境下的数据安全性。通过深入学习和实践,开发者可以更好地处理并发问题,提高系统的稳定性和效率。
在Hibernate中,实现乐观锁的一种常见方式是通过版本字段(version field)来追踪数据的版本。当数据被读取时,版本字段会被一同获取;在更新时,Hibernate会将当前版本与数据库中的最新版本进行比较。如果两个版本...
在Java中,可以使用`@Version`注解配合Hibernate框架来实现乐观锁。 悲观锁则采取相反的策略,它假设数据可能会被其他线程修改,所以在读取数据时就立即加锁,直到事务结束才释放锁。这样可以确保在读取数据到更新...
求助编辑百科名片相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,...
在Hibernate框架中,乐观锁的实现方式之一是通过`version`字段,也就是我们这个练习的主题。`version`字段通常是一个整数或时间戳,记录了数据的版本信息。每次数据更新时,Hibernate会自动将`version`字段加一或者...
- **乐观锁**:在读取时不加锁,假设不会有并发冲突,只有在更新数据时检查是否被其他事务修改过。通常通过版本号或时间戳实现,如果冲突则事务失败。乐观锁适用于读多写少的情况,减少锁的使用,提高并发性能。 在...
本文旨在深入探讨Hibernate中两种主要的锁类型——乐观锁(Optimistic Locking)与悲观锁(Pessimistic Locking)的实现原理及其应用场景。 #### 二、锁的基本概念 在业务逻辑的实现过程中,经常需要保证数据访问...