PESSIMISTIC_WRITE锁定整个表吗?

2022-09-04 22:18:01

只是为了确保我正确地理解事情是如何运作的。

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

如果它很重要,我说的是.PostgreSQL


答案 1

它应该仅阻止实体。

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

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

FOR UPDATE 会导致 SELECT 语句检索到的行被锁定,就像要更新一样。这可以防止它们被其他事务锁定,修改或删除,直到当前事务结束。也就是说,尝试更新,删除,选择更新,选择没有密钥更新,选择共享或选择这些行的其他事务将被阻止,直到当前事务结束;相反,SELECT FOR UPDATE 将等待在同一行上运行了任何这些命令的并发事务,然后锁定并返回更新的行(如果该行已删除,则不返回任何行)。


答案 2

推荐