背景:我正在研究一个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
答案 0 :(得分:2)
数据库本身暗示了锁定类型。
如果您使用的是MyISAM存储引擎,无论您在原始SQL中还是在JDBC中尝试多么努力,都无法强制执行行级锁定。 MyISAM根本不支持行级锁。
只需切换到使用InnoDB,您甚至不必调用setLockMode
来获取必要的锁定类型。
来自manual:
MySQL使用InnoDB表的行级锁定来同时支持 通过多个会话写入访问权限,使其适合 多用户,高度并发和OLTP应用程序。 MySQL使用 允许使用MyISAM,MEMORY和MERGE表的表级锁定 只有一个会话一次更新这些表,使它们更多 适用于只读,大多数读取或单用户应用程序。