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

时间:2015-10-19 13:47:33

标签: hibernate oracle11g locking

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并锁定是否被释放?

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

1 个答案:

答案 0 :(得分:5)

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

但是,请勿使用LockMode.WRITE

  

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

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