Hibernate 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();
代码随后执行此操作:
getSession().saveOrUpdate(sysType);
getSession().flush();
其中getSession()返回Hibernate会话。
我的问题是 - 锁什么时候被释放?如果sysType对象在读取后没有更新过,那么是否会被saveOrUpdate调用DB并锁定是否被释放?
我正在查看我的应用程序的问题,我怀疑它是由于行被锁定而锁定没有被释放从而阻止其他读取。
答案 0 :(得分:5)
在事务结束时释放悲观锁,无论对象是否更新。这是数据库的工作方式;它与Hibernate无关。
但是,请勿使用LockMode.WRITE
:
更新或插入对象时获取WRITE锁定。这个 锁定模式仅供内部使用,不是load()的有效模式 或lock()(如果指定了WRITE,则两者都抛出异常)。
如果您需要悲观锁定(select for update
构建),请使用LockMode.PESSIMISTIC_WRITE
。