如果无法获取锁,则Hibernate LockMode会释放并快速失败

时间:2015-05-24 16:53:57

标签: java hibernate transactions locking pessimistic-locking

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

  1. 如果我使用lockmode UPGRADE锁定一组行,那么当您离开事务范围时,是否会释放锁定?如果是,我们可以跨交易锁定解锁吗?

  2. 对于以下场景,哪个LockMode有用

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

    • 线程2,尝试在同一组行上获取锁定(由线程1锁定)此时线程2获得一个异常,表示行已锁定

    哪个是最好的悲观锁模?

1 个答案:

答案 0 :(得分:3)

  1. LockMode.UPGRADE使用select ... for update,因此会锁定the whole duration of the current transaction。释放锁的唯一方法是提交或回滚事务。

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

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

    entityManager
    .unwrap(Session.class)
    .buildLockRequest(
        new LockOptions(LockMode.PESSIMISTIC_WRITE)
        .setTimeOut(LockOptions.NO_WAIT))
    .lock(entity);
    
  4. 有关详细信息,请查看我在苏黎世Voxxed Days的Transactions and Concurrency Control presentation