背景资料: 我有一个问题,表明实体更新没有通过。查看我的日志,我可以看到我期望的更新sql语句,但它们几乎是同时的(相距0.012秒),并且应用程序在更新实体时使用了悲观的读锁定。
这引出了我的问题: 存在悲观锁定时的预期行为是什么?我是否仍然希望看到多个更新查询?我应该期望抛出PessimisticLockException,对吧?我还应该寻找其他指标吗?
Hibernate是我的JPA实现。
答案 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)