Hibernate锁
来源:互联网 发布:淘宝网店开店物流工具 编辑:程序博客网 时间:2024/06/06 06:46
(1),悲观锁---依靠数据库层提供的锁机制。
String hqlStr = "from TUser as user where user.name=‘Erica‘";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE);//加锁(for update)
List userList = query.list();//执行查询,获取数据
query.setLockMode对查询语句中,特定别名(user)所对应的记录进行加锁。
Hibernate的加锁模式(Hibernate内部使用)有:
LockMode.NONE:无锁机制
LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取。
LockMode.READ:Hibernate在读取记录的时候会自动获取。
依赖数据库的悲观锁机制(应用层):
LockMode.UPGRADE:利用数据库的for update子句加锁。
LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现加锁。
注意:应该查询开始之前设定加锁。
悲观锁的缺点:依赖数据库的锁机制,以保证操作最大程度上的独占性,但导致数据库性能的巨大开销,特别是长事务。
(2),乐观锁
---大多是基于数据版本记录机制实现。
数据版本:即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。
乐观锁策略:提交版本必须大于记录当前版本才能执行更新。
添加一个Version属性描述符
<hibernate-mapping>
<class name="TUser" table="T_USER" dynamic-update="true" dynamic-insert="true" optimistic-lock="version">
<id></id>
<version column="version" name="version" type="java.lang.Integer"/>
</class>
</hibernate-mapping>
注意:version节点必须出现在ID节点之后。
违反乐观锁策略时:tx.commit()处抛出StaleObjectStateException异常,并指出版本检查失败,当前事务正在试图提交一个过期数据。
通过捕捉这个异常,我们就可以在乐观锁校验失败时进行相应处理。
- hibernate锁
- Hibernate锁
- hibernate 锁
- Hibernate锁
- Hibernate锁
- Hibernate锁
- hibernate 锁
- Hibernate锁
- 【Hibernate】---- 锁
- hibernate 锁
- Hibernate 乐观锁 org.hibernate.StaleObjectStateException 异常
- Hibernate 乐观锁 org.hibernate.StaleObjectStateException 异常
- Hibernate的锁
- Hibernate的锁机制
- Hibernate乐观锁
- hibernate的锁机制
- Hibernate乐观锁简介
- hibernate的锁机制
- 用 Chrome 运行 Android 应用
- 基于PHPExcel 导出Excel表格
- mac 终端 常用命令
- 从JSONModel看Objective-C的反射机制
- UVa 10673 - Play with Floor and Ceil
- Hibernate锁
- XDCTF2014 CRACK150&关于dex的一些看法
- Android 基础 View
- ubuntu 磁盘挂载问题
- java通过经纬度计算两个点的之间的距离的算法
- ZendFramework2学习笔记 静态配置layout模板和动态设置layout模板
- PHP运行模式(cgi,fast-cgi,cli,web模块模式)
- 操作系统角度详解Activity(一)
- Redis安装笔记