【问题标题】:Does Hibernate obtains implicit locking for update queryHibernate 是否为更新查询获取隐式锁定
【发布时间】:2018-12-25 04:36:26
【问题描述】:

我正在使用带有 spring boot 的 hibernate,mariadb。 我正在事务存储库方法中执行名为查询的更新。 查询看起来像

update personDetails set status='married' where personeName='abc' and personStatus='unmarried'

在此之后我去更新其他表。

此流程可以由 2 个单独的线程执行。我想要的是只允许一个线程继续进行,并停止另一个线程。因此,能够更新人员状态的线程应该继续进行,而另一个线程应该停止。所以我想在这个更新查询上实现某种锁定。所以问题是,我是否需要在更新之前专门对行进行任何锁定,或者 hibernate/db 会处理这个问题。

【问题讨论】:

    标签: hibernate locking


    【解决方案1】:

    引用 MariaDB documentation:

    对于 UPDATE 和 DELETE 语句,锁定取决于语句是使用具有唯一搜索条件(如 WHERE id = 100)的唯一索引,还是使用范围类型搜索条件(如 WHERE id > 100)。对于具有唯一搜索条件的唯一索引,InnoDB 只锁定找到的索引记录,而不是之前的间隙。对于范围类型的搜索,InnoDB 锁定扫描的索引范围,使用间隙锁或下一个键(间隙加索引记录)锁来阻止其他会话插入范围所覆盖的间隙。

    因此,MariaDB(和 MySQL)在更新期间的默认行为是,至少,特定记录将被锁定以阻止另一个尝试更新它的进程。在 InnoDB 上,如果没有合适的索引可用,那么可能不仅仅是记录会被锁定。在其他引擎上,例如MyISAM,文档还说可以锁定整个表。

    因此,除非 Hibernate 在后台执行一些非标准管道,否则您的担忧不应该成为问题。请注意,我没有讨论如果另一个进程尝试读取正在更新的行会发生什么。每个数据库都以不同的方式处理这个问题。但是,您没有提到这是一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2014-08-13
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多