背景信息:我有一个问题,是一个实体更新没有经过的症状。回顾我的日志,我可以看到我期望的update sql语句,但是它们几乎是同时的(间隔0.012秒),应用程序在更新实体时使用一个悲观的读锁。
这就引出了我的问题:当悲观锁存在时,预期的行为是什么?我还需要看到多个更新查询吗?我应该期望PessimisticLockException会被抛出,对吗?还有什么其他指标需要我去找吗?
Hibernate是我的JPA实现。
发布于 2015-02-03 17:22:24
Pesimistic锁实际上是使用SQL-查询传播到DB级别的(检查要比较的执行的查询)。如果存在悲观锁,应用程序应该等待DB直到锁被释放,因此它不是必须抛出的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方法,这两个异常是在simmilar情况下抛出的。
发布于 2015-02-03 18:24:44
悲观锁定防止对象同时更新。相反,对象的更新正在形成链的类型--如果锁已经存在,则更新将等待直到锁被释放。
因此,抛出异常并不是悲观锁的预期结果。预期行为是消除我前面描述的并发性。
要进一步阅读,您可以参考这和这源代码。
在我们的例子中,您的更新似乎没有通过,因为它被一些后续更新覆盖了。
https://stackoverflow.com/questions/28304837
复制相似问题