`

Hibernate中悲观锁和乐观锁

阅读更多

我们在使用Hibernate中经常用到当多个人对同一数据同时进行修改的时候,会发生脏数据,造成数据的不一致性,解决办法是可以通过悲观锁和乐观锁来实现。

 

Hibernate悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改,优点:数据的一致性保持得很好,缺点:不适合多个用户并发访问。当一个锁住的资源不被释放掉的时候,这个资源永远不会被其他用户进行修改,容易造成无限期的等待。

 

Hibernate乐观锁:就是在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。优点比较好。

 

一、在Hibernate悲观锁中,只要在加载的时候,才去session中的load方法,进行枷锁,session.load(****.class,1,LockMode.UPDATE);

 

Hibernate将事务管理委托给底层的JDBC或者JTA,默认是基于JDBC Transaction的。Hibernate支持“悲观锁(Pessimistic Locking)”和“乐观锁(Optimistic Locking)”。

Hibernate悲观锁对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。Hibernate悲观锁的实现,往往依靠数据库提供的锁机制。Hibernate通过使用数据库的for update子句实现了悲观锁机制。

 

Hibernate的加锁模式有:

 

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子句实现加锁

 

 

二、乐观锁大多是基于数据版本(Version)记录机制实现。Hibernate在其数据访问引擎中内置了Hibernate乐观锁实现,可以通过class描述符的optimistic-lock属性结合version描述符指定。optimistic-lock属性有如下可选取值:

 

 

1. none:无乐观锁

 

2. version:通过版本机制实现乐观锁

 

3. dirty:通过检查发生变动过的属性实现乐观锁

 

4. all:通过检查所有属性实现乐观锁

 

例子:

1)Hibernate悲观锁:

 

1>POJO类

public class PersimisticLocking {  
 private int id;  
   
 private String Item;  
   
 private int price;  
//省略setter、getter方法  
} 

 2>、POJO类的映射文件

<?xml version="1.0"?> 
 <!DOCTYPE hibernate-mapping PUBLIC   
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
 <hibernate-mapping package="org.apple.hibernate"> 
     <class name="PersimisticLocking" table="t_persimisticLocking"> 
         <id name="id"> 
             <generator class="native"/> 
         </id> 
        <property name="item"/> 
        <property name="price"/> 
    </class> 
</hibernate-mapping>

 3>、加载测试方法

public void testLoad1()  
     {  
         Session session = null;  
         try {  
             session = HibernateUtil.getSession();  
             session.beginTransaction();  
             OptimisticLocking o = (OptimisticLocking)session.load(OptimisticLocking.class, 1);  
             System.out.println("o.item="+o.getItem());  
             System.out.println("o.price="+o.getPrice());  
            System.out.println("o.version="+o.getVersion());  
            o.setPrice(o.getPrice()-10);  
            session.update(o);  
            session.beginTransaction().commit();  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
            session.beginTransaction().rollback();  
        }finally{  
            HibernateUtil.closeSession(session);  
        }  
          
    } 

 可以设置另外类似的方法,不枷锁,先对上面的测试代码设置断点,点debug一部分,再运行不枷锁的,可以看到,如果上面方法不释放锁的话,下面的数据就会造成无限期的等待。

 

2、Hibernate乐观锁:

 

1>在悲观锁的基础上加入private int version;和相关的setter、getter方法。

 

2>映射文件配置在class标签里面加入optimistic-lock="version",然后在的id标签后面加入<version name="version"/>

 

3>测试方法:

public void testLoad1()  
     {  
         Session session = null;  
         try {  
             session = HibernateUtil.getSession();  
             session.beginTransaction();  
             OptimisticLocking o = (OptimisticLocking)session.load(OptimisticLocking.class, 1);  
             System.out.println("o.item="+o.getItem());  
             System.out.println("o.price="+o.getPrice());  
            System.out.println("o.version="+o.getVersion());  
            o.setPrice(o.getPrice()-10);  
            session.update(o);  
            session.beginTransaction().commit();  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
            session.beginTransaction().rollback();  
        }finally{  
            HibernateUtil.closeSession(session);  
        }  
          
    } 

 在初始数据的时候,version为0,在没更新一次version都会在原来的基础上加1,通过version的版本来实现Hibernate乐观锁。

在上面的测试方法里面复制成另外一个方法,对上面的方法进行设置断点,然后单步调试几部,到NO.11行的时候暂停,此时对复制的另外方法运行,然后再运行完上面的方法,就会抛出异常,所以,在实际的项目开发中,可以通过对异常进行出来,这样就会实现并发访问。

分享到:
评论

相关推荐

    Hibernate悲观锁和乐观锁的实现

    在进行Hibernate的测试时,可以创建一个名为`hibernate_test`的项目,编写对应的实体类、映射文件以及测试用例,模拟并发场景,来深入理解并对比悲观锁和乐观锁的差异和效果。 总之,理解并合理运用悲观锁和乐观锁...

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

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

    Hibernate的乐观锁与悲观锁

    **Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制问题,其中最常用的就是**乐观锁**和**悲观锁**。本文将详细介绍这两种锁的原理、应用场景以及如何在Hibernate中实现。 #### 二、悲观锁...

    Hibernate乐观锁和悲观锁分析

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

    Hibernate悲观锁与乐观锁案例

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

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

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

    Hibernate悲观锁与乐观锁

    总结来说,Hibernate的悲观锁和乐观锁是两种不同的并发控制策略,悲观锁倾向于预防并发冲突,适合并发较低但需要保证数据一致性的情景;而乐观锁则在并发较高的情况下更优,通过版本控制减少锁定,但在冲突处理上...

    hibernate乐观锁和悲观锁学习

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

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

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

    hibernate的乐观锁和悲观锁

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

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

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

    Hibernate 乐观和悲观锁

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

    Hibernate乐观锁

    Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以...在实际应用中,可以结合悲观锁和其他并发控制策略,以达到最佳的事务处理效果。

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

    乐观锁和悲观锁是数据库和并发编程中常见的两种锁机制,它们主要用于解决多线程环境下的数据一致性问题。在Java面试中,理解这两种锁的概念、工作原理以及适用场景是非常重要的。 乐观锁是一种假设大多数情况下不会...

    hibernate乐观锁

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

    HibernateTest:Hibernate乐观锁和悲观锁的学习和实践

    为了解决这个问题,Hibernate提供了两种锁机制:乐观锁和悲观锁。下面我们将深入探讨这两个概念以及它们在实际应用中的实践。 ### 乐观锁 乐观锁是一种假设大多数情况下不会发生数据冲突的锁策略。在读取数据时不会...

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

    【Hibernate性能优化】:在Java开发中,Hibernate作为流行...在实际开发中,开发者应根据业务场景选择合适的锁定策略,并结合缓存和延迟加载技术,以及优化SQL查询,来平衡性能和数据一致性,实现高效的Hibernate应用。

Global site tag (gtag.js) - Google Analytics