【问题标题】:How to implement row level locking using Hibernate Query Language?如何使用 Hibernate 查询语言实现行级锁定?
【发布时间】:2012-10-29 16:33:59
【问题描述】:

背景:我正在开发一个 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。有没有办法可以申请锁定个别行?任何示例都会很有帮助。

谢谢, 热血

【问题讨论】:

    标签: mysql database hibernate locking


    【解决方案1】:

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

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

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

    来自manual

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多