【发布时间】:2017-04-20 22:23:22
【问题描述】:
我的项目已经为 hibernate 3.3.2.GA 版本锁定了一个行机制,我们计划升级到 hibernate 5。我打算让这个查询在旧的 hibernate 和新的版本中也能工作。
这是hibernate 3.3.2.GA中已有的查询
如果该行已经在会话中锁定,则该查询将锁定该行,将等待超时,如果超时则抛出超时。
Query query = session.getNamedQuery("select aps from WritableSchool aps where aps.schoolCd = :schoolCd");
query.setParameter("schoolCd", schoolCd);
query.setTimeout(2); // seconds
query.setLockMode("aps", LockMode.UPGRADE);
List<WritableSchool> schools = query.list();
当我们升级到休眠 4 / 5 版本时,超时不起作用,如果表已经在会话中锁定,它会永远等待获取锁。
在使用相同代码的休眠 4 中,我尝试以这种方式替换锁定和超时
query.setLockOptions(new LockOptions(LockMode.UPGRADE).setTimeOut(100));
它仍然无法超时工作。
我也尝试了另一种方法。
session.buildLockRequest(LockOptions.NONE).setLockMode(LockMode.UPGRADE).setTimeOut(2000).lock(school);
它正在执行 select.. 以进行更新,但我执行时不遵守超时。
目前我手头的唯一解决方案是覆盖休眠 oracle 方言并将shouldUseFollowOnLocking() 设置为返回 false,这也会获得锁定和荣誉超时。
我想知道为什么休眠的 Lockoptions 超时不遵守相同的规定。如果有人对休眠中的锁和超时有任何想法,请帮助,谢谢。
【问题讨论】: