hibernate使用version实现乐观锁
来源:互联网 发布:河南知满天 编辑:程序博客网 时间:2024/06/08 06:46
乐观锁的作用
乐观锁的主要作用是为了解决事务并发带来的问题。相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个"version"字段来实现。
乐观锁的工作原理
读取出数据时,将此版本号一同读出,而更新对象时,对此版本号加一(使用hql来update时没有校验version)。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据,抛出异常。
基于hibernate的乐观锁实现
基于hibernate的乐观锁实现一般有以下两种方式
即可。
乐观锁的主要作用是为了解决事务并发带来的问题。相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(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
- hibernate使用version实现乐观锁
- Hibernate乐观锁实现之Version
- Hibernate乐观锁实现——Version
- Hibernate乐观锁实现—Version
- Hibernate 乐观锁实现之 Version
- Hibernate并发控制乐观锁实现-Version
- Hibernate乐观锁实现之Version
- Hibernate乐观锁实现之Version
- Hibernate 乐观锁实现之 Version
- Hibernate乐观锁实现之Version
- Hibernate 乐观锁实现之 Version
- Hibernate乐观锁实现之Version
- Hibernate乐观锁之Version
- Hibernate学习:乐观锁version
- Hibernate并发控制乐观锁实现——Version
- Hibernate并发控制乐观锁实现——Version
- 乐观锁-version的使用
- 【hibernate框架】使用hibernate实现悲观锁和乐观锁
- 非常好的highcharts学习地址
- ios中 继承对象模型的归档实现
- 最全SpringMVC详细示例实战教程
- 单词计数程序在hadoop上的实现
- 怎样使用复合索引优化一个分析函数SQL
- hibernate使用version实现乐观锁
- 通知系统相册收录新图片
- 深入研究java.lang.ThreadLocal类
- 添加Custom debug keystore
- wp7 webbrowser+html5 打造本地应用程序
- Comparable与Comparator的区别
- UVaLive 3708 Graveyard 墓地雕塑
- 创建多个UIButton其中只有一个显示选中效果
- WinExec可能会引起消息重入