标签:
一:什么是锁?
需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓 的“锁”,即给我们选定的目标数据(对象)上锁,使其无法被其他程序修改
二: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 " />
标签:
原文地址:http://www.cnblogs.com/hellokitty1/p/5053255.html