【问题标题】:Does PESSIMISTIC_WRITE lock the whole table?PESSIMISTIC_WRITE 是否锁定整个表?
【发布时间】:2018-08-15 06:34:28
【问题描述】:

只是为了确保我正确理解事情的运作方式。

如果我这样做 em.lock(employee, LockModeType.PESSIMISTIC_WRITE); - 它会只阻止这个实体 (employee) 还是整个表 Employees

如果重要的话,我说的是PostgreSQL

【问题讨论】:

  • 它不是 stackoverflow.com/questions/33062635/… 的副本,因为我有一个具体的问题:它是否锁定了 WHOLE
  • 为了让它更有趣,MSSQL 中的LockModeType.PESSIMISTIC_WRITE 将转换为with (updlock, rowlock),其中行锁可以完全升级到表或页面,因为这只是一个提示。更有趣的是,查询一些不属于覆盖非聚集索引(或聚集)的条目仍然会相互阻塞......你真的必须查看并了解数据库的内容完全可以。
  • 我知道——这正是我的观点(我希望我能够将它传达给你)——查看生成的查询并尝试理解这些查询,不要盲目相信 hibernate(或任何其他工具)
  • @Eugene,是的,我明白你的意思。
  • 看,告诉你;)

标签: java postgresql hibernate jpa locking


【解决方案1】:

它应该只屏蔽实体。

PostgreSQL 休眠方言在写锁的情况下添加for updatehttps://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java#L549 (较新的版本只是使用相同的实现)

for update 被 PostgreSQL 逐行处理: https://www.postgresql.org/docs/9.5/static/explicit-locking.html

FOR UPDATE 导致 SELECT 语句检索到的行 像更新一样被锁定。这可以防止它们被锁定, 被其他事务修改或删除,直到当前 交易结束。也就是说,其他尝试 UPDATE 的事务, 删除,选择更新,选择无键更新,选择共享 或 SELECT FOR KEY SHARE 这些行将被阻止,直到 当前交易结束;相反, SELECT FOR UPDATE 将等待 已在 同一行,然后将锁定并返回更新的行(或者没有行,如果 该行已被删除)。

【讨论】:

  • 所以你得到了正确的行保证?如果选择的是单行,如果有一定范围的触摸行怎么办?
猜你喜欢
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多