hibernate使用version实现乐观锁

来源:互联网 发布:河南知满天 编辑:程序博客网 时间:2024/06/08 06:46
乐观锁的作用 
乐观锁的主要作用是为了解决事务并发带来的问题。相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个"version"字段来实现。 

乐观锁的工作原理 
读取出数据时,将此版本号一同读出,而更新对象时,对此版本号加一(使用hql来update时没有校验version)。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据,抛出异常。 

基于hibernate的乐观锁实现 

基于hibernate的乐观锁实现一般有以下两种方式 
  • 基于version
  • 基于timestamp

这里就介绍一下基于version的乐观锁实现:

1.创建表时,增加version字段:

CREATE TABLE `fi_prj` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `prj_id` int(11) NOT NULL COMMENT '项目ID',  `prj_type` tinyint(2) DEFAULT NULL COMMENT '项目类型)',  `user_id` int(11) NOT NULL COMMENT '用户id',  `ctime` int(11) NOT NULL COMMENT '创建时间',  `mtime` int(11) NOT NULL COMMENT '修改时间',  `version` int(11) DEFAULT '0' COMMENT '版本号',  PRIMARY KEY (`id`),) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='项目表'
</pre><p><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; font-size:14px; line-height:25.2000007629395px">2.在映射文件中加上<version>:</span></p><p><span style="font-family:Helvetica,Tahoma,Arial,sans-serif"><span style="font-size:14px; line-height:25.2000007629395px"></span></span></p><pre name="code" class="html">        <id name="id" type="java.lang.Long">            <column name="id" />            <generator class="identity" />        </id>     <strong>   <version name="version" type="java.lang.Integer">            <column name="version" precision="10" scale="0">            </column>        </version></strong>

即可。

在更新时,若校验版本号失败,则会抛出org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)异常。

备注:

1.使用hql或者原生sql更新时,version失效,所以尽量使用saveOrUpdateAll或者update方法。


0 0
原创粉丝点击