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

时间:2015-02-03 17:14:07

标签: java hibernate jpa locking

背景资料: 我有一个问题,表明实体更新没有通过。查看我的日志,我可以看到我期望的更新sql语句,但它们几乎是同时的(相距0.012秒),并且应用程序在更新实体时使用了悲观的读锁定。

这引出了我的问题: 存在悲观锁定时的预期行为是什么?我是否仍然希望看到多个更新查询?我应该期望抛出PessimisticLockException,对吧?我还应该寻找其他指标吗?

Hibernate是我的JPA实现。

2 个答案:

答案 0 :(得分:3)

Pesimistic锁实际上使用SQL查询传播到数据库级别(检查执行的查询以进行比较)。 如果存在悲观锁,则应用程序应该等待数据库,直到锁被释放为止,因此不必强制引发expcetion(但它可能是)。

现在关于例外:

/*
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 :(得分:1)

悲观锁定可防止对象同时更新。相反,对象的更新正在构成一种链 - 如果锁已经存在,则更新将等到锁被释放。

因此,抛出异常并不是悲观锁定的预期结果。预期的行为是消除了我上面描述的并发性。

如需进一步阅读,请参阅thisthis来源。

在我们的情况下,您的更新似乎没有通过,因为它被稍后的更新覆盖。