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

Java JPA-悲观锁-当锁存在时会发生什么?,java,hibernate,jpa,locking,Java,Hibernate,Jpa,Locking,背景资料: 我有一个问题,是实体更新未通过的症状。查看我的日志,我可以看到我期望的update sql语句,但它们几乎是同时出现的(相隔0.012秒),并且应用程序在更新实体时使用了悲观的读锁 这就引出了我的问题: 当悲观锁存在时,预期的行为是什么?我还应该看到多个更新查询吗?我应该期望抛出悲观锁异常,对吗?我还应该寻找其他指标吗 Hibernate是我的JPA实现。伪锁实际上是使用SQL查询传播到DB级别的(检查执行的查询以进行比较)。 如果存在悲观锁,应用程序应该等待DB,直到锁被释放,因此

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

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


Hibernate是我的JPA实现。

伪锁实际上是使用SQL查询传播到DB级别的(检查执行的查询以进行比较)。 如果存在悲观锁,应用程序应该等待DB,直到锁被释放,因此抛出表达式不是强制性的(但可以)

关于例外情况:

/*
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);
/*
如果悲观锁定失败并回滚事务,则悲观锁定异常
如果悲观锁定失败且仅回滚语句,则LockTimeoutException
*/
public T find(类entityClass、对象primaryKey、LockModeType lockMode);

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

悲观锁定会阻止对象同时更新。相反,对象的更新正在形成某种链——如果锁已经存在,更新将等待锁释放

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

如需进一步阅读,请参阅和参考资料

在我们的例子中,您的更新似乎没有通过,因为它被稍后的更新覆盖了