我正在使用NHibernate查询报告数据库中的数据,并希望优化READ性能。 “脏读”根本不是一个问题。 NHibernate提供锁定模式。如果我使用LockMode.UpgradeNoWait模式,我可以看到在生成的SQL中出现'with(updlock,rowlock)'。我一直在阅读这篇文章,但遗憾的是我的SQL不够复杂,无法真正理解其后果。我相信我真正想要的是出现'with(nolock)'语句,但NHibernate并没有提供任何方法来做到这一点。
我的问题是:假设我的表正在写入其他交易中。在这个表的查询中,'with(updlock,rowlock)'提示会导致它更快地返回吗?它会伤害性能吗?查询是针对单个表的非常简单的选择。没有加入。表上有一个非聚集索引,用于覆盖查询。
答案 0 :(得分:4)
updlock
会在被触摸(选中)的每一行上放置更新锁 - 所以这意味着直到事务结束(显式或隐式),行被触及SELECT
将对它们进行更新锁定,允许其他事务读取,但不更新或删除该行。
rowlock
只表示您需要行级锁而不是页锁或表锁。
如果您需要先选择,然后在同一显式事务中更新一行,那么该锁是有意义的。
它不会使它运行得更快,并且可能导致其他事务被阻止
答案 1 :(得分:0)
显然我错误地认为在NHibernate中使用Lock模式。它们与将nolock提示添加到查询没有任何关系。 This is the way to do it.