只是为了确保我正确理解事情的运作方式。
如果我em.lock(employee, LockModeType.PESSIMISTIC_WRITE);
- 是否会仅阻止此实体(employee
)或整个表格Employees
?
如果重要,我说的是PostgreSQL
。
答案 0 :(得分:4)
它应该只阻止实体。
PostgreSQL hibernate方言在写锁时添加for update
:
https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java#L549
(较新的版本只使用相同的实现)
for update
:
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将等待 一个已在其上运行任何这些命令的并发事务 相同的行,然后将锁定并返回更新的行(如果是,则没有行 该行已被删除)。