Hibernate是否获取更新查询的隐式锁定

时间:2018-12-25 04:36:26

标签: hibernate locking

我正在使用带有Spring Boot的mariadb休眠模式。 我正在事务性存储库方法内执行名为query的更新。 查询看起来像

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

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

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

1 个答案:

答案 0 :(得分:1)

引用MariaDB documentation

  

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

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

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