【问题标题】:Does LockMode.WRITE release the Lock if no update is done如果没有更新,LockMode.WRITE 是否释放锁
【发布时间】:2015-10-19 22:12:18
【问题描述】:

休眠 3.2.6 甲骨文 11.x

我正在查看的代码使用此行锁定表行以进行更新:

Query query = createQuery("from MyTable t where t.col1 = :param1");
            query.setParameter("param1", "blah");
            query.setLockMode("s", LockMode.WRITE);
            return (SysType) query.uniqueResult();

代码随后执行此操作:

getSession().saveOrUpdate(sysType);
getSession().flush();

其中 getSession() 返回一个 Hibernate 会话。

我的问题是 - 什么时候释放锁?如果 sysType 对象自读取后未更新,是否会通过 saveOrUpdate 调用 DB 并释放锁?

我正在查看我的应用程序的一个问题,我怀疑这是由于行被锁定而锁没有被释放从而阻塞其他读取引起的。

【问题讨论】:

    标签: hibernate oracle11g locking


    【解决方案1】:

    悲观锁在事务结束时释放,不管对象是否更新。这是数据库的工作方式;它与 Hibernate 无关。

    但是,不要使用LockMode.WRITE

    在更新或插入对象时获得WRITE 锁。这个 锁定模式仅供内部使用,不是 load() 的有效模式 或 lock()(如果指定了 WRITE,两者都会抛出异常)。

    如果您需要悲观锁(select for update 构造),请改用 LockMode.PESSIMISTIC_WRITE

    【讨论】:

    • “仅供内部使用” - 内部用于什么,休眠?
    • @CodeClimber 是的,Hibernate 内部的。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多