PESSIMISTIC_WRITE会锁定整个表吗?

时间:2018-03-07 08:22:18

标签: java postgresql hibernate jpa locking

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

如果我em.lock(employee, LockModeType.PESSIMISTIC_WRITE); - 是否会仅阻止此实体(employee)或整个表格Employees

如果重要,我说的是PostgreSQL

1 个答案:

答案 0 :(得分:4)

它应该只阻止实体。

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

PostgreSQL按行处理

for updatehttps://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将等待   一个已在其上运行任何这些命令的并发事务   相同的行,然后将锁定并返回更新的行(如果是,则没有行   该行已被删除)。