1

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

我的代码如下。

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

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

谢谢你,甘达富

4

1 回答 1

2

锁定类型由数据库本身隐含。

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

只需切换到使用 InnoDB,您甚至无需调用setLockMode即可获得必要的锁定类型。

手册

MySQL 对 InnoDB 表使用行级锁定,以支持多个会话同时写入访问,使其适用于多用户、高并发和 OLTP 应用程序。MySQL 对 MyISAM、MEMORY 和 MERGE 表使用表级锁定,一次只允许一个会话更新这些表,使其更适合只读、多读或单用户应用程序。

于 2012-10-29T22:55:01.730 回答