`
jihongbin12329
  • 浏览: 40414 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate中悲观锁 乐观锁

    博客分类:
  • JAVA
阅读更多

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悲观锁和乐观锁的实现

    在Hibernate源码中,乐观锁的实现主要依赖于`AbstractEntityPersister`类的`checkOptimisticLocking()`方法,它会比较当前对象的版本信息与数据库中的版本信息,如果不同则抛出`StaleObjectStateException`异常。...

    Hibernate的乐观锁与悲观锁

    ### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...

    Hibernate乐观锁和悲观锁分析

    【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...

    Hibernate悲观锁与乐观锁案例

    在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...

    数据库事务、hibernate悲观锁和乐观锁

    在Hibernate中,可以使用`@Version`注解来实现乐观锁,该注解会在实体类的一个属性上添加版本字段,每次更新时,Hibernate会比较当前版本号和数据库中的版本号,如果不同,则认为有并发冲突,更新失败。乐观锁的优点...

    Hibernate悲观锁与乐观锁

    《Hibernate 悲观锁与乐观锁详解》 在多用户并发访问的环境中,数据库管理系统必须具备有效的数据访问控制机制,以确保数据的一致性和完整性。Hibernate,作为一款流行的Java持久化框架,提供了两种主要的锁定策略...

    hibernate乐观锁和悲观锁学习

    本文主要讨论的是Hibernate框架中两种锁机制的使用:乐观锁和悲观锁。 首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它...

    hibernate的乐观锁和悲观锁

    ### Hibernate的乐观锁和悲观锁 #### 一、引言 在软件开发中,尤其是在涉及大量并发操作的应用场景下,确保数据的一致性和完整性是非常重要的。对于基于Java Web的应用而言,Hibernate作为一款流行的ORM框架,提供...

    Hibernate锁机制_悲观锁和乐观锁

    Hibernate 中有两种锁机制:悲观锁和乐观锁。 一、悲观锁(Pessimistic Locking) 悲观锁是一种预防并发访问的机制,Hibernate 通过对数据库的锁定来实现。悲观锁假定任何时刻存取数据时,都可能有另一个客户也...

    Java 中的悲观锁和乐观锁的实现

    ### Java中的悲观锁与乐观锁实现详解 #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将...

    Hibernate实现悲观锁和乐观锁代码介绍

    在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 Hibernate 的隔离机制和锁机制。 Hibernate 的隔离机制 Hibernate 的隔离机制是基于数据库的事务隔离级别的。 Hibernate 提供了四种...

    Hibernate 乐观和悲观锁

    标题中的“Hibernate 乐观和...总的来说,掌握Hibernate的乐观锁和悲观锁是Java开发中的一项重要技能,它关乎到并发环境下的数据安全性。通过深入学习和实践,开发者可以更好地处理并发问题,提高系统的稳定性和效率。

    Hibernate乐观锁

    在Hibernate中,实现乐观锁的一种常见方式是通过版本字段(version field)来追踪数据的版本。当数据被读取时,版本字段会被一同获取;在更新时,Hibernate会将当前版本与数据库中的最新版本进行比较。如果两个版本...

    面试必备之乐观锁与悲观锁.zip

    在Java中,可以使用`@Version`注解配合Hibernate框架来实现乐观锁。 悲观锁则采取相反的策略,它假设数据可能会被其他线程修改,所以在读取数据时就立即加锁,直到事务结束才释放锁。这样可以确保在读取数据到更新...

    hibernate乐观锁

    求助编辑百科名片相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,...

    乐观锁version-练习

    在Hibernate框架中,乐观锁的实现方式之一是通过`version`字段,也就是我们这个练习的主题。`version`字段通常是一个整数或时间戳,记录了数据的版本信息。每次数据更新时,Hibernate会自动将`version`字段加一或者...

    Hibernate性能(缓存 延迟加载 事务 悲观 乐观锁).ppt

    - **乐观锁**:在读取时不加锁,假设不会有并发冲突,只有在更新数据时检查是否被其他事务修改过。通常通过版本号或时间戳实现,如果冲突则事务失败。乐观锁适用于读多写少的情况,减少锁的使用,提高并发性能。 在...

    hibernate锁详解

    本文旨在深入探讨Hibernate中两种主要的锁类型——乐观锁(Optimistic Locking)与悲观锁(Pessimistic Locking)的实现原理及其应用场景。 #### 二、锁的基本概念 在业务逻辑的实现过程中,经常需要保证数据访问...

Global site tag (gtag.js) - Google Analytics