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 "     />  

原文地址:https://www.cnblogs.com/hellokitty1/p/5053255.html