3

关于 Hibernate 3.3.2.ga 中可用的悲观锁定模式,我有两个问题:

  1. 如果我使用 lockmode UPGRADE 锁定一组行,当您移出事务范围时,锁定是否会被释放?如果是,我们可以跨事务锁定解锁吗?

  2. 对于以下场景,哪种 LockMode 会很有用

    • 线程 1,尝试获取锁并锁定一组行

    • 线程 2,尝试在同一组行(被线程 1 锁定)上获得锁,此时线程 2 得到一个异常,说行被锁定

    哪个是最好的悲观 LockMode?

4

1 回答 1

6
  1. LockMode.UPGRADE使用,因此在当前事务的整个持续时间内select ... for update持有锁。释放锁的唯一方法是提交或回滚事务。

  2. 锁将select ... for update导致第二个事务等待第一个事务释放锁。如果你想快速失败,你需要使用:UPGRADE_NOWAIT,它将使用select ... for update no wait查询,如果无法获取锁则抛出异常(Oracle 和 PostgreSQL 都支持)。

  3. LockOptions或者,您可以按如下方式使用 Hibernate :

    entityManager
    .unwrap(Session.class)
    .buildLockRequest(
        new LockOptions(LockMode.PESSIMISTIC_WRITE)
        .setTimeOut(LockOptions.NO_WAIT))
    .lock(entity);
    

有关更多详细信息,请查看我在 Voxxed Days Zurich 的事务和并发控制演示

于 2015-05-25T12:57:07.963 回答