PESSIMISTIC_WRITE是否会锁定整个表?

14

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

如果我执行 em.lock(employee, LockModeType.PESSIMISTIC_WRITE); - 它会阻塞仅限于这个实体 (employee) 还是整个表 Employees

如果有关系,我说的是 PostgreSQL


这不是 https://dev59.com/UFwY5IYBdhLWcg3wD0PG 的重复,因为我有具体的问题:它是否锁定整个表。 - Andremoniy
1
为了让编程更有趣,MSSQL中的LockModeType.PESSIMISTIC_WRITE将被翻译为with (updlock, rowlock),其中rowlock可能会升级到整个表或页面,因为这只是一个提示。更有趣的是,查询一些不属于覆盖非聚集索引(或聚集)的条目仍然会相互阻塞...你真的必须仔细观察和理解数据库将要做的事情。 - Eugene
1
我知道 - 这正是我的观点(希望我能够传达给你)- 查看生成的查询并尝试理解它们,不要盲目信任Hibernate(或任何其他工具)。 - Eugene
1
@Eugene,是的,我明白你的意思。 - Andremoniy
2
看吧,我告诉过你的 ;) - Kayaman
显示剩余6条评论
1个回答

9

它应该仅阻止实体。

PostgreSQL hibernate方言在写锁的情况下添加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、DELETE、SELECT FOR UPDATE、SELECT FOR NO KEY UPDATE、SELECT FOR SHARE或SELECT FOR KEY SHARE的其他事务将被阻塞直到当前事务结束;反过来,SELECT FOR UPDATE将等待在同一行上运行过这些命令的并发事务,然后锁定并返回更新的行(如果行已被删除,则不返回行)。


那么您如何获得正确的行保证呢?如果您选择了单个行,那么如果有一系列被触及的行呢? - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接