JPA - 悲观锁 - 当锁存在时会发生什么?

5
背景信息: 我遇到了一个问题,它表明实体更新无法完成。查看我的日志后,我可以看到预期的更新SQL语句,但它们几乎是同时进行的(相隔0.012秒),当更新实体时应用程序使用悲观读锁。
这就引出了我的问题: 当存在悲观锁时,预期行为是什么?我是否仍应该期望看到多个更新查询?我应该期望抛出PessimisticLockException异常,对吗?还有其他我应该寻找的指标吗?
Hibernate是我的JPA实现。
2个回答

5

悲观锁实际上是通过SQL查询传播到数据库级别的(检查执行的查询以进行比较)。 如果存在悲观锁,则应用程序应等待数据库直到锁被释放,因此不一定会抛出异常(但可能会)。

现在让我们来谈谈异常:

/*
PessimisticLockException if pessimistic locking fails and the transaction is rolled back
LockTimeoutException if pessimistic locking fails and only the statement is rolled back
*/
public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode);

对于其他EntityManager方法,在类似情况下也会抛出这两个异常。


1
悲观锁定可以防止对象同时被更新。相反,对象的更新形成了一种链式结构——如果锁已经存在,则更新将等待锁被释放。
因此,抛出异常不是悲观锁的预期结果。预期行为是消除我上面描述的并发情况。
如需进一步阅读,请参考 thisthis 来源。
在我们的情况下,似乎您的更新没有成功,因为它被某个较晚的更新覆盖了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接