zoukankan      html  css  js  c++  java
  • Hibernate中的锁机制

    一:什么是锁?

          需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓 的“锁”,即给我们选定的目标数据(对象)上锁,使其无法被其他程序修改 

    二:hibernate中的锁?

       Hibernate支持两种锁机制 - “悲观锁(Pessimistic Locking)” - “乐观锁(Optimistic Locking)”。

    三:怎样使用锁?

      悲观锁:悲观锁就像他的名字一样,他认为每次他在操作数据库的时候,其他客户端程序也在执行这同样的操作。因此,对操作的数据进行锁定,直到自己的操作完成后解除锁定。

                所以,悲观锁的实现一般都是依赖数据库本身的锁机制。

     乐观锁:相对于悲观锁来说,乐观锁提供了更宽松的加锁机制。他乐观的认为他在操作数据的时候,很少发生与之相同的情况。他不在数据库层次上进行锁定。为了维护正确的数据,乐观锁应用程序上的逻辑实现数据                版本号控制解决。

    数据版本号:是为了维护数据库增加一个版本标识,一般情况是通过给数据库表增加一个“version”字段来实现。

    悲观锁的实现是基于数据库的锁机制完成的,可以使用Query或Criteria的setLockMode()方法来设定要锁定的数据和锁定的模式。

    例如:  

    Query  query=session.createQuery(" from   User u where u.name='kitty' ");

    query.setLockMode('c',LockMode.UPGRADE);

    List list=query.list();

    代码送的别名为“u”的User对象进行锁定,在hibernate中加锁模式有:

    - LockMode.NONE : 无锁机制

    - LockMode.WRITE :Hibernate在Insert和Update记录的时进行锁定

    - LockMode.READ : Hibernate在读取记录时进行锁定

    - LockMode.UPGRADE :利用数据库的for update子句加锁。

    - LockMode. UPGRADE_NOWAIT :Oracle的特定实现,利用 Oracle的for update nowait子句实现加锁

    注意:只有在查询开始之前(也就是Hiberate 生成SQL 之前)设定加锁,才会真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含for update 子句的Select SQL加载进来,所谓数据库加锁也就没有意义了。

    乐观锁:

    乐观锁依靠数据版本记录机制实现

    - 为数据增加一个版本标识 ,增加一个version字段

    - 读取数据时,将版本号一同读出

    - 更新时,版本号加一

    - 将提交数据的版本与数据库表对应记录的当前版本信息进行比对

    - 如果提交的数据 版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据

    首先:为持久类增加一个version属性及相应方法。

    接着为class描述符添加optimistic-lock属性:

    例如:

    < hibernate - mapping >  

            <class name="com.cy.beans.Homework" table="t_homework" catalog="j2ee" optimistic - lock = " version "   >

                …… 

           </ class >

     </ hibernate - mapping >  

    optimistic-lock属性有如下可选取值:

    - none 无乐观锁

    - version 通过版本机制实现乐观锁 (官方推荐)

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

    - all 通过检查所有属性实现乐观锁

    然后:添加一个Version属性描述符

     < version    column = " version "    name = " version "    type = " java.lang.Integer "     />  

  • 相关阅读:
    自习任我行第二阶段个人总结5
    自习任我行第二阶段个人总结4
    自习任我行第二阶段个人总结3
    自习任我行第二阶段个人总结2
    自习任我行第二阶段个人每日总结1
    bootstrap table
    log4j2 的使用
    新版本MySQL Server 5.7的免安装版本设置
    工作随笔 2016-5-19
    在windows 下安装启动redis
  • 原文地址:https://www.cnblogs.com/hellokitty1/p/5053255.html
Copyright © 2011-2022 走看看