如果没有完成更新,LockMode.WRITE 是否释放锁

Does LockMode.WRITE release the Lock if no update is done

休眠 3.2.6 甲骨文 11.x

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

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() returns 一个 Hibernate 会话。

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

我正在查看我的应用程序的一个问题,我怀疑这是由于行被锁定而未释放锁从而阻止其他读取造成的。

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

但是,不要使用 LockMode.WRITE:

WRITE lock is obtained when an object is updated or inserted. This lock mode is for internal use only and is not a valid mode for load() or lock() (both of which throw exceptions if WRITE is specified).

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