快速业务通道

hibernate3学习笔记(二十三)|进阶特性(一) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

hibernate3学习笔记(二十三)|进阶特性(一)

时间:2011-02-03

1.悲观锁定:

在多个客户端可能读取同一笔数据或同时更新一笔数据的情况下,必须要有访问控制的手段,防止同一个数据被修改而造成混乱,最简单的手段就是对资料进行锁定,在自己进行资料读取或更新等动作时,锁定其他客户端不能对同一笔资料进行任何的动作。

悲观锁定(Pessimistic Locking)一如其名称所示,悲观的认定每次资料存取时,其它的客户端也会存取同一笔资料,因此对该笔资料进行锁定,直到自己操作完成後解除锁定。

悲观锁定通常透过系统或资料库本身的功能来实现,依赖系统或资料库本身提供的锁定机制,Hibernate即是如此,可以利用Query或Criteria的setLockMode()方法来设定要锁定的表或列(Row)及其锁定模式,可设定的锁定模式有以下的几个:

LockMode.UPGRADE:利用资料库的for update子句进行锁定。

LockMode.UPGRADE_NOWAIT:使用for update nowait子句进行锁定,在Oracle资料库中使用。

一个设定锁定的例子如下:

Session session = sessionFactory.openSession(); Query query = session.createQuery("from User user"); query.setLockMode("user", LockMode.UPGRADE); List users = query.list();

...

session.close();这个程式片段会使用以下的SQL进行查询:

Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_

from user user0_ for update也可以在使用Session的load()或是lock()时指定锁定模式以进行锁定。

另外还有三种加锁模式Hibernate内部自动对资料进行锁定,与资料库无关:

LockMode.WRITE:在insert或update时进行锁定,Hibernate会在save()方法时自动获得锁定。

LockMode.READ:在读取记录时Hibernate会自动获得锁定。

LockMode.NONE:没有锁定。

如果资料库不支援所指定的锁定模式,Hibernate会选择一个合适的锁定替换,而不是丢出一个例外。

hibernate3学习笔记(二十三)|进阶特性(一)(2)

时间:2011-02-03

2.乐观锁定:

悲观锁定假定任何时刻存取资料时,都可能有另一个客户也正在存取同一笔资料,因而对资料采取了资料库层次的锁定状态,在锁定的时间内其他的客户不能对资料 进行存取,对於单机或小系统而言,这并不成问题,然而如果是在网路上的系统,同时间会有许多连线,如果每一次读取资料都造成锁定,其後继的存取就必须等 待,这将造成效能上的问题,造成後继使用者的长时间等待。

乐观锁定(Optimistic locking)则乐观的认为资料的存取很少发生同时存取的问题,因而不作资料库层次上的锁定,为了维护正确的资料,乐观锁定使用应用程式上的逻辑实现版本控制的解决。

在不实行悲观锁定策略的情况下,资料不一致的情况一但发生,有几个解决的方法,一种是先更新为主,一种是後更新的为主,比较复杂的就是检查发生变动的资料来实现,或是检查所有属性来实现乐观锁定。

Hibernate中透过版本号检查来实现後更新为主,这也是Hibernate所推荐的方式,在资料库中加入一个version栏位记录,在读取资料时 连同版本号一同读取,并在更新资料时比对版本号与资料库中的版本号,如果等於资料库中的版本号则予以更新,并递增版本号,如果小於资料库中的版本号就丢出 例外。

实际来透过范例了解Hibernate的乐观锁定如何实现,首先在资料库中新增一个表格:

CREATE TABLE user (    id INT(11) NOT NULL auto_increment PRIMARY KEY,    version INT,    name VARCHAR(100) NOT NULL default '''',    age INT );

这个user表格中的version用来记录版本号,以供Hibernate实现乐观锁定,接着设计User类别,当中必须包括version属性:

User.java

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号