【问题标题】:Hibernate LockMode release and fail-fast if the lock cannot be acquired如果无法获取锁,则休眠 LockMode 释放和快速失败
【发布时间】:2015-05-24 16:53:57
【问题描述】:

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

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

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

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

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

    哪种是最好的悲观LockMode?​​p>

【问题讨论】:

  • 这是你今天的作业吗?
  • 不废话,处理业务用例。 :)

标签: java hibernate transactions locking pessimistic-locking


【解决方案1】:
  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都支持)。

    李>
  3. 或者,您可以使用 Hibernate LockOptions,如下所示:

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

有关详细信息,请查看我在 Voxxed Days Zurich 的Transactions and Concurrency Control presentation。

【讨论】:

  • 感谢弗拉德,试图在 MySQL 中实现一个没有等待条件的悲观锁,但似乎不可能。必须采用乐观的版本检查策略。
猜你喜欢
  • 2015-02-10
  • 2011-06-30
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2015-05-13
  • 2015-04-15
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多