如何使用Hibernate查询语言实现行级锁定?

时间:2012-10-29 16:34:00

标签: mysql database hibernate locking

背景:我正在研究一个MYSql数据库,其中多个实例从同一个帐户表中读取。我想使用Hibernate查询语言实现行级别独占锁,以避免脏读。

我的代码如下。

List<AccountTableBean> currentRequestslist = sessionFactory.getCurrentSession()
                .createQuery("from Account where status = :finalStatus")
                .setLockMode("MappCurrentRequests", LockMode.PESSIMISTIC_READ)
                .setParameter("finalStatus","Active").list();   

目前,我在整个表上使用了Pessimistic_read。有没有办法可以申请锁定各行?任何例子都会非常有用。

谢谢你, Gendaful

1 个答案:

答案 0 :(得分:2)

数据库本身暗示了锁定类型。

如果您使用的是MyISAM存储引擎,无论您在原始SQL中还是在JDBC中尝试多么努力,都无法强制执行行级锁定。 MyISAM根本不支持行级锁。

只需切换到使用InnoDB,您甚至不必调用setLockMode来获取必要的锁定类型。

来自manual

  

MySQL使用InnoDB表的行级锁定来同时支持   通过多个会话写入访问权限,使其适合   多用户,高度并发和OLTP应用程序。 MySQL使用   允许使用MyISAM,MEMORY和MERGE表的表级锁定   只有一个会话一次更新这些表,使它们更多   适用于只读,大多数读取或单用户应用程序。