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

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

Hibernate是我的JPA实现。

最佳答案

悲观锁实际上是使用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方法,在类似情况下会抛出这两个异常。

09-10 22:54