Hibernate锁

原创 2015年07月10日 14:50:45

http://haiziwoainixx.iteye.com/blog/969476



业务逻辑的实现过程中,往往需要保证数据访问的排他性,也就是说,我们需要一些机制来保证选取的数据在使用过程中不会被外界修改,这样的机制,就是“锁”,即给我们选定的目标数据上锁,使其无法被其它程序来修改。
(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与数据库锁

一、为什么要使用锁? 要想弄清楚锁机制存在的原因,首先要了解事务的概念。 事务是对数据库一系列相关的操作,它必须具备ACID特征: A(原子性):要么全部成功,要么全部撤销。 ...
  • dc_726
  • dc_726
  • 2012年08月11日 22:40
  • 8129

hibernate 锁

业务实现过程中,难免需要保证数据访问的排他性。如两个事务同时判断条件成立,都进行数据插入的情况,这时我们就需要依赖锁机制来解决这种条件同时成立的情况。Hibernate 支持两种锁机制:悲观锁(Pes...
  • pingnanlee
  • pingnanlee
  • 2015年05月27日 09:28
  • 1254

Hibernate锁机制的简单理解

我们知道事务并发会引发一些问题,一个典型的例子就是银行存取款的问题: 比如一个账户,用户A和B同时对它操作。假设账户里有1000元,A要往里存100元,而B要取100元, 假设这两个事务同...
  • z69183787
  • z69183787
  • 2014年04月02日 19:22
  • 644

我们如何使用Hibernate的锁(悲观锁)

厚积薄发!!!
  • hushanfeng110
  • hushanfeng110
  • 2015年12月01日 19:30
  • 2421

Hibernate(五)——面向对象查询语言和锁

Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了。但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hi...
  • liujiahan629629
  • liujiahan629629
  • 2014年03月19日 22:41
  • 5752

hibernate锁 数据库大并发

学了两天的hibernate锁机制,今天写个总结。Hibernate锁机制包括悲观锁和乐观锁。 1.悲观锁 它指的是对数据被外界修改持保守态度。假定任何时刻存取数据时,都可能有另一个客户也正在存取同一...
  • Truong
  • Truong
  • 2013年05月15日 11:02
  • 3033

hibernate4性能之并发和锁机制

数据库事务的定义 数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性...
  • crazyitlhs
  • crazyitlhs
  • 2015年10月27日 12:01
  • 3638

Oracle行级锁的特殊用法简析

Oracle有许多的锁,各种锁的效用是不一样的。下面重点介绍Oracle行级锁,Oracle行级锁只对用户正在访问的行进行锁定。可以更好的保证数据的安全性,需要的朋友可以了解下 Oracle...
  • zcouy
  • zcouy
  • 2017年06月16日 11:26
  • 437

Hibernate中的Entity类的乐观锁配置

Hibernate中对Entity对象的修改,最终往往是要持久化到存储中的,那么Hibernate如何保证存储的有效性呢? 首先,持久化Entity对象的修改仅限于对存储的UPDATE和DELETE...
  • taiyangdao
  • taiyangdao
  • 2016年05月26日 15:05
  • 2856

细谈Hibernate之悲观锁和乐观锁解决hibernate并发

锁( locking),这个概念在我们学习多线程的时候曾经接触过,其实这里的锁和多线程里面处理并发的锁是一个道理,都是暴力的把资源归为自己所有。这里我们用到锁的目的就是通过一些机制来保证一些数据在某个...
  • qq_27376871
  • qq_27376871
  • 2016年06月06日 17:01
  • 7301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate锁
举报原因:
原因补充:

(最多只允许输入30个字)