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