是NOLOCK(SQL服务器提示)不好的做法?是NOLOCK(SQL服务器提示)不好的做法?(Is

2019-05-04 12:37发布

我在做网站, 属于关键任务应用程序的业务- >如。 银行软件,太空飞行,重症监护监测中的应用,等你明白了吧。

因此,与大规模的声明,这样做不好使用NOLOCK提示在一些SQL语句? 许多年前,它是由一个同伴SQL管理员,我应该使用NOLOCK如果我很高兴与“脏读”,这会给我更多的表现出我的系统,因为每个读不锁建议表/行/不管。

我还被告知,这是一个很好的解决方案,如果我遇到死锁。 于是,我开始跟随这个想法了几年,直到一个SQL大师在帮我做一些随机的代码,发现在我的SQL代码的所有NOLOCKS。 我礼貌地骂,他试图向我解释(为什么这是不是一件好事),我有几分迷路了。 我觉得他的解释本质是“这是一个创可贴解决一个更严重的问题..尤其是当您遇到死锁。 因此,解决该问题的根源”。

我最近做了一些关于谷歌搜索,并碰上了这个职位 。

因此,可以将某些SQL数据库大师老师的请赐教?

Answer 1:

随着NOLOCK提示,对于事务隔离级别SELECT语句READ UNCOMMITTED 。 这意味着,查询可以看到脏和不一致的数据。

这是不适用的规则是一个好主意。 即使这个脏读行为是关键任务的基于Web的应用程序确定,一个NOLOCK扫描可能会导致601错误,将终止查询由于数据移动由于缺乏闭锁保护的结果。

我建议读快照隔离帮助和当它伤害 -在MSDN建议使用在大多数情况下读提交快照而不是快照。



Answer 2:

此前对堆栈溢出的工作,我是反对NOLOCK上,你可能执行的主要SELECTNOLOCK并取回数据的结果可能是过时或不一致的。 考虑的一个因素是多少条记录可以被插入/同时另一个进程可以从同一个表中选择数据更新。 如果这种情况发生了很多再有就是,除非你使用一个数据库模式,如死锁的概率高READ COMMITED SNAPSHOT

因为我已经改变了我对使用的角度来看NOLOCK看到它如何能提高后SELECT性能以及消除死锁大规模加载的SQL Server上。 有迹象表明,你可能不关心你的数据是不完全100%承诺的时间和你快速反击,即使他们可能会过时的需要的结果。

问自己一个问题使用的思维时NOLOCK

请问我的查询包含有大量的表INSERT / UPDATE命令,做我不在乎,如果从查询可能会丢失这些变化在给定时刻返回的数据?

如果答案是否定的,那么使用NOLOCK来提高性能。


我只是执行快速搜索为NOLOCK的代码库堆栈溢出内的关键字,发现138分的情况下,所以我们用它在相当多的地方。



Answer 3:

如果你不在乎脏读(即在主要阅读的情况),那么NOLOCK是罚款。

但是 ,要知道,大多数的锁定问题是由于没有“正确的”索引查询的工作量(假设硬件是完成这一任务)。

而大师的解释是正确的。 它通常是一个创可贴解决一个更严重的问题。

编辑 :我绝对不会提示NOLOCK应该被使用。 我想我应该作出明确的明显。 (我会永远只能用它,在那里我曾分析说,这是确定的极端情况下)。 作为一个例子,前阵子我曾在一些TSQL已被撒上NOLOCK尝试和减轻锁定问题。 我删除了所有这些,实施正确的索引,所有的死锁的走了。



Answer 4:

怀疑是谁喝了在高流量的任何经验,“大师”?

网站通常是由人观看完全加载页面的时间“脏”。 考虑一种形式,从数据库加载,然后保存多数民众赞成编辑的数据? 这是愚蠢的人去弄脏的方式读是这样的,不,不。

也就是说,如果你有许多层建立在你的选择,你可以建设一个危险的冗余。 如果你正在处理金钱或地位的情况,那么你需要读/不仅交易数据写入,但适当的并发解决方案(这是大多数“大师”不费心)。

在另一方面,如果你有一个网站,一个先进的产品搜索(即的东西,可能不会被缓存,有点密集的),你曾经建立了一个网站有超过几并发用户(phenominal多少“专家”都没有),这是荒谬的,以瓶颈所有其它进程背后。

知道这意味着什么,并在适当的时候使用它。 您的数据库将几乎永远是你的主要瓶颈,这些天,聪明关于使用NOLOCK可以为你节省数千基础设施。

编辑:这不只是锁死它有助于,它也是你要多少让别人等待,直到你完成,反之亦然。

在EF4使用NOLOCK提示?



Answer 5:

问题的答案没有错,但是有点混乱可能。

  • 当查询单值/排它总是不好的做法,使用NOLOCK -你可能永远都不想显示不正确的信息,或者甚至采取不正确的数据采取任何行动。
  • 当显示粗略的统计信息,NOLOCK是非常有用的。 所以采取为例:这将是无稽之谈采取锁阅读的看法问题,或对标签问题的确切人数的确切数字。 没有人关心,如果你错误状态现在标记为“SQL服务器” 3360分的问题,因为一个事务回滚,3359个问题一秒钟后的。


Answer 6:

作为一个专业的开发者我会说这要看情况。 但我绝对遵循GATS和OMG小马建议。 知道你在做什么,知道什么时候它有助于当它伤害和

阅读提示和其他贫穷的想法

什么能让你了解SQL服务器更深。 我一般遵循SQL提示是邪恶统治,但不幸的是我现在,然后用它们每次当我厌倦了强制SQL服务器做的事情......但这些都是罕见的情况下。

卢克



Answer 7:

当应用程序支持想回答使用SSMS(即不通过报告照顾)从生产服务器的广告,典当查询我要求他们使用NOLOCK。 这样,“主”的业务不会受到影响。



Answer 8:

我同意关于NOLOCK提示,尤其是那些说:“使用它时,它是适当的”一些评论。 如果写得不好,并使用并发不当的应用方式 - 可能导致锁升级。 高事务表也被锁所有的时间,由于其性质。 具有良好的指数覆盖面将不与检索数据的帮助,但设置隔离级别设置为未提交读呢。 同时,我认为使用NOLOCK提示是在许多情况下,安全的,当变化的情况是可以预见的。 例如 - 在时与旅客的工作是通过不同的进程要与大量的测量嵌件的制造,可以安全地执行查询针对与NOLOCK提示完成的工作,这种方式避免与放引起了其他会议或放在桌子上EXCLUSIVE锁冲突/页。 你在这种情况下,访问数据是静态的,但它可能与数以亿计的记录,数千更新/每分钟插入驻留在一个非常事务表。 干杯



Answer 9:

我认为,这是实际上从未正确使用NOLOCK。

如果你正在读单行,那么正确的指数意味着,各行的操作快速完成你不需要NOLOCK。

如果你正在读许多行比临时显示其他什么,而在乎能重复的结果,或通过辩护产生的号码,然后NOLOCK是不恰当的。

NOLOCK是:“如果这个答案包含重复行,行被删除,或从来没有插入开始,因为回滚的行我不在乎”的替代品标签

错误这下NOLOCK是可能的:

  • 在所有没有返回的行其匹配。
  • 单一行返回多次(包括相同的主键的多个实例)
  • 行不匹配返回。

任何作用,这可能会导致页面拆分而NOLOCK选择运行可能导致出现这些事情。 几乎任何动作(甚至删除)可能会导致页面拆分。

因此:如果你“知道”,而你正在运行该行不会被改变,不NOLOCK使用,作为索引将允许高效的检索。

如果您怀疑查询运行时,该行可以改变,你在意的准确性,不要使用NOLOCK。

如果你正在考虑,因为死锁NOLOCK,检查意外表扫描查询计划结构,跟踪死锁,看看他们为什么会发生。 NOLOCK各地写道可能意味着先前僵持查询将有可能既写了错误的答案。



Answer 10:

在更好的解决方案,在可能的情况是:

  • 复制数据(使用日志的复制)到报告数据库中。
  • 使用SAN快照和安装DB的版本一致
  • 使用具有更好的基本事务隔离级别数据库

快照事务隔离级别的形成是因为MS正在失去销售到Oracle。 Oracle使用撤销/重做日志来避免这个问题。 Postgres使用MVCC。 在未来的MS的Heckaton将使用MVCC,但是这几年远离在进入生产准备。



Answer 11:

NOLOCK经常利用为神奇方式来加快数据库中读取,但我会尽量避免使用它whever可能。

结果集可以包含尚未提交的行,这往往是后回滚。

错误或结果集可以为空,是缺少的行或多次显示在同一行。

这是因为其他事务在你读它,同时移动数据。

READ COMMITTED增加了,其中数据在多个用户同时改变相同的小区的单个列中损坏一个额外的问题。



Answer 12:

在你遇到已经写入和添加索引的表,然后急剧减慢一个14gig数据表的数据加载系统的现实生活中,你有时不得不使用NOLOCK在您的报告和月proessing的结束使用,以至于总funtions(总和,计数等)不做行,页,表锁定和deteriate整体性能。 易在一个新的系统来说切勿使用NOLOCK和使用指标 - 但添加索引severly降级数据加载,当我再叫,好了,改变的代码库中删除索引,然后批量加载,然后重新创建索引 - 这是一切都很好,如果你正在开发一个新的系统。 而不是当你已经到位有一个系统。



文章来源: Is the NOLOCK (Sql Server hint) bad practice?