hibernate3学习笔记(二十三)|进阶特性(一) - 编程入门网
hibernate3学习笔记(二十三)|进阶特性(一)时间:2011-02-031.悲观锁定: 在多个客户端可能读取同一笔数据或同时更新一笔数据的情况下,必须要有访问控制的手段,防止同一个数据被修改而造成混乱,最简单的手段就是对资料进行锁定,在自己进行资料读取或更新等动作时,锁定其他客户端不能对同一笔资料进行任何的动作。 悲观锁定(Pessimistic Locking)一如其名称所示,悲观的认定每次资料存取时,其它的客户端也会存取同一笔资料,因此对该笔资料进行锁定,直到自己操作完成後解除锁定。 悲观锁定通常透过系统或资料库本身的功能来实现,依赖系统或资料库本身提供的锁定机制,Hibernate即是如此,可以利用Query或Criteria的setLockMode()方法来设定要锁定的表或列(Row)及其锁定模式,可设定的锁定模式有以下的几个: LockMode.UPGRADE:利用资料库的for update子句进行锁定。 LockMode.UPGRADE_NOWAIT:使用for update nowait子句进行锁定,在Oracle资料库中使用。 一个设定锁定的例子如下:
... 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-032.乐观锁定: 悲观锁定假定任何时刻存取资料时,都可能有另一个客户也正在存取同一笔资料,因而对资料采取了资料库层次的锁定状态,在锁定的时间内其他的客户不能对资料 进行存取,对於单机或小系统而言,这并不成问题,然而如果是在网路上的系统,同时间会有许多连线,如果每一次读取资料都造成锁定,其後继的存取就必须等 待,这将造成效能上的问题,造成後继使用者的长时间等待。 乐观锁定(Optimistic locking)则乐观的认为资料的存取很少发生同时存取的问题,因而不作资料库层次上的锁定,为了维护正确的资料,乐观锁定使用应用程式上的逻辑实现版本控制的解决。 在不实行悲观锁定策略的情况下,资料不一致的情况一但发生,有几个解决的方法,一种是先更新为主,一种是後更新的为主,比较复杂的就是检查发生变动的资料来实现,或是检查所有属性来实现乐观锁定。 Hibernate中透过版本号检查来实现後更新为主,这也是Hibernate所推荐的方式,在资料库中加入一个version栏位记录,在读取资料时 连同版本号一同读取,并在更新资料时比对版本号与资料库中的版本号,如果等於资料库中的版本号则予以更新,并递增版本号,如果小於资料库中的版本号就丢出 例外。 实际来透过范例了解Hibernate的乐观锁定如何实现,首先在资料库中新增一个表格:
这个user表格中的version用来记录版本号,以供Hibernate实现乐观锁定,接着设计User类别,当中必须包括version属性:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |