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

The*_*ger 5 java hibernate jpa locking

背景信息:我遇到一个问题,其症状是实体更新未完成。查看我的日志,我可以看到我期望的更新 sql 语句,但它们几乎是同时的(相隔 0.012 秒),并且应用程序在更新实体时使用悲观读锁。

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

Hibernate 是我的 JPA 实现。

And*_*i I 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);
Run Code Online (Sandbox Code Playgroud)

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