证明在每个查询中不使用(nolock)提示


23

您是否曾经有过不使用查询提示的理由?

WITH (NOLOCK)在每一个查询中都看到一个非常繁忙的服务器。关键是,开发人员认为默认情况下应该启用它,因为他们讨厌在代码中看到它数千次。

我试图解释说,这将允许脏读,最终它们将得到错误的数据,但是他们认为性能的折衷是值得的。(他们的数据库是一团糟;难怪他们会遇到性能问题。)

如果您有一个明确的示例,说明如何针对这种滥用NOLOCK提示的情况进行陈述,那将不胜感激。

Answers:


17

您选择自己的战斗,这样的战斗就很难轻易获胜。我们有一个系统,其中每个DML都有ROWLOCK提示(与修改一行或几千行无关)。我展示了几个示例,为什么它确实会影响性能,但是由于系统已经在运行,因此存在对变更的抵制。请注意,尽管如此,我还是说服他们不要使用此功能。

NOLOCK有它的位置,但是我可以推荐一些很好的参考资料来说明使用它的麻烦:



9

您必须向同事解释了解隔离级别的重要性。给他们看例子。我在Little Kendra的隔离级别海报中找到了最简单的解释。问他们为什么他们认为他们需要nolock提示。他们为什么不使用“设置事务隔离级别...”语句?询问他们到底要修复什么情况,也许他们有死锁,阻塞等等。如果他们只是不想持有锁,他们可能会考虑快照隔离级别。

只有问他们,您才能有清晰的画面。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.