蜘蛛侠暗影之网mod:乐观锁机制

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 02:06:20
 l相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。 l乐观锁,大多是基于数据版本(Version)记录机制实现。数据版本即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。   l我们为之前示例中的TUser加上乐观锁机制。 1.首先为TUser的class描述符添加optimistic-lock属性: ……    loptimistic-lock属性有如下可选取值: lnone:无乐观锁 lversion:通过版本机制实现乐观锁 ldirty:通过检查发生变动过的属性实现乐观锁 lall:通过检查所有属性实现乐观锁 l通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,同时也是Hibernate中,目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择version方式作为Hibernate乐观锁实现机制。   2. 添加一个Version属性描述符 ……   l每次对TUser进行更新的时候,我们可以发现,数据库中的version都在递增。 l而如果我们尝试在tx.commit 之前,启动另外一个Session,对名为Erica 的用户进行操作,以模拟并发更新时的情形执行以上代码,代码将在tx.commit()处抛出StaleObjectStateException异常,并指出版本检查失败,当前事务正在试图提交一个过期数据。通过捕捉这个异常,我们就可以在乐观锁校验失败时进行相应处理。