PESSIMISTIC_WRITE会锁定整个表吗?

And*_*niy 7 java postgresql hibernate jpa locking

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

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

如果重要,我在谈论PostgreSQL.

Ant*_*hev 5

它应该仅阻止实体。

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

for updatePostgreSQL按行进行处理: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将等待在同一行上运行了任何这些命令的并发事务,然后将锁定并返回更新的行(如果删除了该行,则不返回任何行)。