为了确保我正确理解事情的运作方式。
如果我执行 em.lock(employee, LockModeType.PESSIMISTIC_WRITE);
- 它会阻塞仅限于这个实体 (employee
) 还是整个表 Employees
?
如果有关系,我说的是 PostgreSQL
。
为了确保我正确理解事情的运作方式。
如果我执行 em.lock(employee, LockModeType.PESSIMISTIC_WRITE);
- 它会阻塞仅限于这个实体 (employee
) 还是整个表 Employees
?
如果有关系,我说的是 PostgreSQL
。
它应该仅阻止实体。
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
在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将等待在同一行上运行过这些命令的并发事务,然后锁定并返回更新的行(如果行已被删除,则不返回行)。
LockModeType.PESSIMISTIC_WRITE
将被翻译为with (updlock, rowlock)
,其中rowlock可能会升级到整个表或页面,因为这只是一个提示。更有趣的是,查询一些不属于覆盖非聚集索引(或聚集)的条目仍然会相互阻塞...你真的必须仔细观察和理解数据库将要做的事情。 - Eugene