猿问
下载APP

是NOLOCK(Sql Server提示)不好的做法吗?

是NOLOCK(Sql Server提示)不好的做法吗?

我的业务是制作关键任务的网站和应用程序- 例如。银行软件,太空飞行,重症监护应用等。你明白了。

那么,有了这个庞大的免责声明,在一些Sql语句中使用NOLOCK提示是不是很糟糕?几年前,一位Sql管理员建议我应该使用NOLOCK,如果我对“脏读”感到满意,这会让我的系统性能提高一些,因为每次读取都没有锁定表/行/不管。

我还被告知,如果我遇到死锁,这是一个很好的解决方案。所以,我开始关注这个想法几年,直到一个Sql大师帮我一些随机代码并注意到我的sql代码中的所有NOLOCKS。我被礼貌地骂了,他试图向我解释(为什么这不是一件好事)而且我迷路了。我觉得他的解释的本质是'它是一个解决更严重问题的创可贴解决方案......特别是如果你遇到了死锁。因此,修复问题的根源。

我最近做了一些谷歌搜索,并发现了这篇文章

那么,有些sql db guru sensei的请赐教吗?


慕哥9229398
浏览 42回答 3
3回答

慕村225694

使用NOLOCK提示,SELECT语句的事务隔离级别为READ UNCOMMITTED。这意味着查询可能会看到脏的和不一致的数据。这通常不适合申请。即使您的基于Web的关键任务应用程序的脏读行为正常,NOLOCK扫描也可能导致601错误,由于缺少锁定保护而导致数据移动,这将终止查询。我建议在快照隔离帮助和何时受伤时阅读 - 在大多数情况下,MSDN建议使用READ COMMITTED SNAPSHOT而不是SNAPSHOT。

慕慕0277861

在使用Stack Overflow之前,我反对NOLOCK委托人,你可以使用可能过期或不一致的数据来执行SELECTwith NOLOCK并获取结果。要考虑的一个因素是可以在同一个表中选择数据的同时插入/更新多少记录。如果这种情况发生很多,那么死锁的可能性很高,除非您使用数据库模式我已经改变了我对使用NOLOCK后的看法,见证了它如何提高SELECT性能以及消除大量加载的SQL Server上的死锁。有时您可能并不关心您的数据是否完全100%提交,即使它们可能已过期,您也需要快速返回结果。在考虑使用时问自己一个问题NOLOCK:我的查询是否包含具有大量INSERT/ UPDATE命令的表,我是否关心从查询返回的数据是否可能在给定时刻丢失这些更改?如果答案是否定的,则使用NOLOCK提高性能。我刚刚在NOLOCKStack Overflow的代码库中快速搜索了关键字,发现了138个实例,所以我们在很多地方使用它。

尚方宝剑之说

如果您不关心脏读(即主要处于READ状态),那么NOLOCK就可以了。但是,请注意,大多数锁定问题是由于没有查询工作负载的“正确”索引(假设硬件完成任务)。大师的解释是正确的。它通常是解决更严重问题的创可贴解决方案。编辑:我绝对不建议使用NOLOCK。我想我应该明白这一点。(我只会在极端情况下使用它,我已经分析过它可以)。作为一个例子,前一段时间我在一些TSQL上工作,这些TSQL上撒有NOLOCK以试图缓解锁定问题。我删除了所有,实现了正确的索引,所有的死锁都消失了。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答