我正在使用Hibernate 3.6.10FINAL,但无法为SQLServer2008生成nowait命令。我尝试使用两种方言(“SQLServer2008Dialect”和“SQLServerDialect”(它们都生成完全不同的SQL查询))无效。我尝试了以下方法:
List<TournamentTemplateRecord> leastRecentlyUsedTournaments = s.createCriteria(TournamentTemplateRecord.class)
.addOrder(Order.asc("lastUse"))
.setMaxResults(5)
.setLockMode(LockMode.UPGRADE_NOWAIT)
.setTimeout(0)
.list();
List<TournamentTemplateRecord> leastRecentlyUsedTournaments = s.createQuery("from TournamentTemplateRecord ORDER BY lastUse")
.setMaxResults(5)
.setLockOptions(LockOptions.UPGRADE)
.setTimeout(0)
.list();
for(TournamentTemplateRecord t : leastRecentlyUsedTournaments){
s.buildLockRequest(LockOptions.UPGRADE).setTimeOut(LockOptions.NO_WAIT).setLockMode(LockMode.UPGRADE_NOWAIT).lock(t);
}
它们都不产生nowait查询。这是在所有情况下的生成查询:WITH query AS (select
ROW_NUMBER() OVER (
order by
tournament0_.lastuse) as __hibernate_row_nr__,
tournament0_.combattemplateid as id89_,
tournament0_1_.combattypeid as combatty2_89_,
tournament0_1_.combattargetid as combatta3_89_,
tournament0_1_.resourcenameid as resource4_89_,
tournament0_1_.resourcedescriptionid as resource5_89_,
tournament0_1_.rewardloottemplateid as rewardlo6_89_,
tournament0_1_.combatcontainertypeid as combatco7_89_,
tournament0_.requirementtemplateid as requirem2_90_,
tournament0_.assetid as assetid90_,
tournament0_.durationinsec as duration4_90_,
tournament0_.lastuse as lastuse90_
from
tournament_tournamenttemplate tournament0_
inner join
readyforcombat_combattemplate tournament0_1_ with (updlock, rowlock)
on tournament0_.combattemplateid=tournament0_1_.id ) SELECT
*
FROM
query
WHERE
__hibernate_row_nr__ BETWEEN ? AND ?
我怎样才能让我的查询不等待锁定?编辑:
值得一提的是
.setLockMode(LockMode.UPGRADE_NOWAIT)
和.setLockMode(LockMode.PESSIMISTIC_WRITE)
生成相同的确切查询更新:
我发现这是我使用的 hibernate 版本中的一个问题。根据这个HHH-3961,我正在使用的Hibernate版本(3.6.10Final)中未解决此问题。太升级了Hibernate 4.x对我来说不是一个选择,是否可以手动为查询设置“nowait”提示?
最佳答案
由于这个问题得到了一些支持和看法,我想我应该发布解决方案。我最终做了一个本地查询。这不是理想的方法,但可以作为一种临时解决方法(例如hack)很好地工作。
TournamentTemplateRecord lastActiveTournament = (TournamentTemplateRecord) s.createSQLQuery(
"SELECT TOP 1 * FROM Tournament_TournamentTemplate tt " +
"WITH (updlock, rowlock, nowait) " +
"ORDER BY tt.lastUse desc"
)
.addEntity(TournamentTemplateRecord.class)
.uniqueResult();