首页 > 其他 > 详细

悲观锁

时间:2014-02-26 15:58:44      阅读:321      评论:0      收藏:0      [点我收藏+]

悲观锁,正如其名,具有强烈的独占排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

一个典型的依赖数据库的悲观锁调用:

bubuko.com,布布扣
select * from account where name="Erica" for update
bubuko.com,布布扣

这条sql语句锁定了account表中所有符合检索条件(name="Erica")的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。

Hibernate的悲观锁,也是基于数据库的锁机制实现。
下面的代码实现了对查询记录的加锁:

bubuko.com,布布扣
String hqlStr = "from TUser as user where user.name=Erica";
Query query = session.createQuery(hqlStr);
query.setLockMode("user", LockMode.UPGRADE); // 加锁
List userList = query.list();// 执行查询,获取数据
bubuko.com,布布扣

query.setLockMode 对查询语句中,特定别名所对应的记录进行加锁(我们为TUser类指定了一个别名"user"),这里也就是对返回的所有user记录进行加锁。

观察运行期Hibernate生成的SQL语句:

bubuko.com,布布扣
select 
tuser0_.id as id, tuser0_.name as name, tuser0_.group_id as group_id, 
tuser0_.user_type as user_type, tuser0_.sex as sex 
from t_user tuser0_ 
where (tuser0_.name=Erica ) 
for update
bubuko.com,布布扣

悲观锁

原文:http://www.cnblogs.com/linjiqin/p/3568103.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!