如果没有完成更新,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
。
休眠 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
。