Hibernate LockMode 释放并在无法获取锁时快速失败

Dee*_*ija 3 java hibernate locking transactions pessimistic-locking

我有两个关于 Hibernate 3.3.2.ga 中提供的悲观 LockMode 的问题:

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

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

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

    • 线程 2 尝试获取同一组行上的锁(与线程 1 锁定的行相同),此时线程 2 收到异常,指出行已锁定

    哪种是最好的悲观 LockMode?

Vla*_*cea 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);
    
    Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看我在苏黎世 Voxxed Days 上发表的交易和并发控制演示