Cod*_*ber 2 hibernate locking oracle11g
休眠3.2.6 Oracle 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();
Run Code Online (Sandbox Code Playgroud)
该代码随后执行此操作:
getSession().saveOrUpdate(sysType);
getSession().flush();
Run Code Online (Sandbox Code Playgroud)
其中getSession()返回一个Hibernate会话。
我的问题是-何时释放锁?如果sysType对象自读取以来尚未更新,则DB是否由saveOrUpdate调用,并且是否释放了锁?
我正在查看我的应用程序的问题,我怀疑这是由于该行被锁定并且该锁未释放而导致阻止其他读取而引起的。
不管事务是否更新,在事务结束时都会释放悲观锁。这是数据库的工作方式。它与休眠无关。
但是,不要使用LockMode.WRITE:
在更新或插入对象时获得WRITE锁定。此锁定模式仅供内部使用,对于load()或lock()(如果指定了WRITE,则两者都将引发异常)不是有效的模式。
LockMode.PESSIMISTIC_WRITE如果您需要悲观锁(select for update构造),请改用。