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乐观锁

  • 2012年12月31日 09:28
  • 65KB
  • 下载

hibernate乐观锁

  • 2013年05月07日 22:48
  • 6KB
  • 下载

Hibernate与数据库锁

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

hibernate锁详解

  • 2012年07月29日 16:40
  • 30KB
  • 下载

Hibernate并发控制乐观锁实现——Version

乐观并发控制,可以有三种方式。 1,Version版本号 2,时间戳 3,自动版本控制。 这里不建议在新的应用程序中定义没有版本或者时间戳列的版本控制:它更慢,更复杂,如果你正...

Hibernate批量处理、事务和锁

Hibernate批量处理、事务和锁 1.       Hibernate批量处理 a)       原因               i当用hibernate 做大批量处理时,比如将百万乃至更多条数...

hibernate锁 数据库大并发

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

Hibernate并发控制乐观锁实现-Version

通过在表中及POJO中增加一个version字段来表示记录的版本,来达到多用户同时更改一条数据的冲突 数据库脚本:   create table studentVersion (id var...

Hibernate中的悲观锁的使用

Product类 public class Product { private String proid; private String name; private int num; pub...

hibernate的锁

业务实现过程中,难免需要保证数据访问的排他性。如金融系统的日终结算中,我们会针对某个截止点的数据进行处理,在此同时,不希望在结算的这段时间里(几秒钟或者几个钟头),数据再有变动,不然我们的统计也无效了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate锁
举报原因:
原因补充:

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