关于 Hibernate 3.3.2.ga 中可用的悲观锁定模式,我有两个问题:
如果我使用 lockmode UPGRADE 锁定一组行,当您移出事务范围时,锁定是否会被释放?如果是,我们可以跨事务锁定解锁吗?
对于以下场景,哪种 LockMode 会很有用
线程 1,尝试获取锁并锁定一组行
线程 2,尝试在同一组行(被线程 1 锁定)上获得锁,此时线程 2 得到一个异常,说行被锁定
哪个是最好的悲观 LockMode?
关于 Hibernate 3.3.2.ga 中可用的悲观锁定模式,我有两个问题:
如果我使用 lockmode UPGRADE 锁定一组行,当您移出事务范围时,锁定是否会被释放?如果是,我们可以跨事务锁定解锁吗?
对于以下场景,哪种 LockMode 会很有用
线程 1,尝试获取锁并锁定一组行
线程 2,尝试在同一组行(被线程 1 锁定)上获得锁,此时线程 2 得到一个异常,说行被锁定
哪个是最好的悲观 LockMode?
LockMode.UPGRADE使用,因此在当前事务的整个持续时间内都select ... for update
持有锁。释放锁的唯一方法是提交或回滚事务。
锁将select ... for update
导致第二个事务等待第一个事务释放锁。如果你想快速失败,你需要使用:UPGRADE_NOWAIT,它将使用select ... for update no wait
查询,如果无法获取锁则抛出异常(Oracle 和 PostgreSQL 都支持)。
LockOptions
或者,您可以按如下方式使用 Hibernate :
entityManager
.unwrap(Session.class)
.buildLockRequest(
new LockOptions(LockMode.PESSIMISTIC_WRITE)
.setTimeOut(LockOptions.NO_WAIT))
.lock(entity);
有关更多详细信息,请查看我在 Voxxed Days Zurich 的事务和并发控制演示。