背景信息:
我有一个问题,表明没有进行实体更新。查看日志,我可以看到我期望的更新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方法,在类似情况下会抛出这两个异常。