Questions tagged «nolock»

4
NOLOCK总是不好吗?
我是一个报表开发人员,想要使我的查询尽可能高效。我曾经和一个DBA一起工作,他告诉我-我相信是因为我一直在生产服务器上处理报表-可以NOLOCK在每个查询中使用。 现在,我与一个NOLOCK在任何情况下都被禁止使用的DBA一起工作-即使我的报告(由于在几个表上严重缺乏索引)正在停止复制和系统更新。我认为,在这种情况下,a NOLOCK将是一件好事。 由于我的大多数SQL培训都针对不同的DBA提出了截然不同的意见,因此我想向各种各样的DBA提出这一要求。

1
(NOLOCK)与NOLOCK
当我看到类似以下查询的查询时,我正在调查一些阻塞: SELECT SomeField FROM SomeTable NOLOCK 我看到了,NOLOCK并且很好奇它如何阻止其他查询(在本例中为DELETE语句)。我快速浏览了使用的锁sp_lock,这是我看到的内容: DB S GRANT TAB IS GRANT PAG S GRANT 现在,我的理解是NOLOCK应该只获取一个Schema-Stability锁,为什么它随后会获取IS锁? 我的好奇心激起了。我查看了BOL,发现有两种使用方法,WITH (NOLOCK)并且已经过时了(NOLOCK),所以我决定尝试一下。我运行以下查询,随后运行sp_lock: SELECT SomeField FROM SomeTable WITH (NOLOCK) DB S授权 TAB Sch-S GRANT SELECT SomeField FROM SomeTable (NOLOCK) DB S授权 TAB Sch-S GRANT 果然,这里有我的架构稳定性锁。所以我的问题是:这是怎么回事?如果使用NOLOCK的可接受语法是WITH (NOLOCK)或(NOLOCK),那么为什么仅使用普通NOLOCK字符(不带括号)运行查询时却不会出现查询错误?如果支持,为什么要抓住IS锁?我在这里想念什么?我一直在网上寻找答案,但到目前为止还很短。 我已经在2008R2和2012上对此进行了测试。

3
证明在每个查询中不使用(nolock)提示
您是否曾经有过不使用查询提示的理由? 我WITH (NOLOCK)在每一个查询中都看到一个非常繁忙的服务器。关键是,开发人员认为默认情况下应该启用它,因为他们讨厌在代码中看到它数千次。 我试图解释说,这将允许脏读,最终它们将得到错误的数据,但是他们认为性能的折衷是值得的。(他们的数据库是一团糟;难怪他们会遇到性能问题。) 如果您有一个明确的示例,说明如何针对这种滥用NOLOCK提示的情况进行陈述,那将不胜感激。

1
如何重现“由于数据移动,无法使用NOLOCK继续扫描”
我偶尔会遇到NOLOCK一些大型作业“确实由于数据移动而无法继续扫描”的情况,这些作业确实存在WITH (NOLOCK)于选择查询中。 我知道这与尝试在发生页面拆分时选择数据有关,这导致数据不再位于应有的位置-我认为这就是我的环境中发生的事情。 我将如何重现? 我试图做一个短期的变通办法来捕获错误并在发生这种情况时重试,但是如果无法重现它,我将无法对其进行测试。是否有合理可靠的方法引起这种情况? 当发生这种情况时,再次执行查询会成功-因此,我对实际数据或数据库永久损坏没有任何担心。查询中的某些表(以及它们的索引)经常被删除,重新创建和重新填充,因此我假设它与此相关。 删除NOLOCK是我要解决的长期问题。首先NOLOCK放在这里的原因是,查询是如此糟糕,以至于它们陷入日常事务的僵局中,因此NOLOCK,用于阻止僵局(工作正常)的创可贴也是如此。因此,在我们可以做一个永久性解​​决方案之前,我需要一个创可贴。 如果我可以用《 Hello World》来复制它,我计划在不到一个小时的时间内将创可贴打入工作。无法进行搜索和替换删除NOLOCK,因为我将再次开始遇到应用死锁,这对我来说比偶尔的失败工作更糟糕。 使用读取提交的快照隔离是一种很好的可能性-我将不得不与我们的数据库团队合作以获取有关该快照的更多详细信息。问题的一部分是,我们没有SQL Server专家来处理此类问题,而且我对隔离级别的理解不充分,无法立即进行更改。

1
由于数据移动,无法继续使用NOLOCK进行扫描
我们运行SQL Server 2000,并且每晚都有一些此类错误。 Could not continue scan with NOLOCK due to data movement 引发此错误的查询是一个大型的复杂查询,连接了十几个表。我们的基础数据可以经常更新。 文化上的“最佳实践”是,过去,引入NOLOCK提示可以提高性能并提高并发性。该查询不必是100%准确的,即我们可以忍受脏读等。但是,尽管我们拥有所有这些锁定提示,但我们仍在努力理解为什么数据库抛出此错误。 任何人都可以对此有所了解-彬彬有礼,我实际上是程序员,而不是DBA :) PS:我们已经应用了下面提到的修复程序:http : //support.microsoft.com/kb/815008

1
如何证明NOLOCK是死锁问题的根源?
我不是要开始Windows / Mac类型的讨论。 就个人而言,我不需要任何令人信服NOLOCK的自反练习。似乎当您开发所有内容时,应该是有目的的,而不是反动的(/ amen) 所以...主管程序员坚持NOLOCK是要走的路。建议所有临时查询以及每次查询生产时使用。我还没有看到在每个表上都没有nolock提示的存储过程。 不想成为一个进来告诉所有人核心信念的家伙,没有任何支持的想法是错误的。 仅查看各个博客文章下的评论会话,发送链接可能还不够。长期存在的信念等...有些人不相信这是一个问题。请参阅:我阅读的每篇nolock博客文章下的“评论”部分。 当前,其他一些DBA正在努力解决一些神秘的僵局。如何确定NOLOCKs是否为源? 建议从跟踪等中查看XML,但这不会明确指出死锁是导致问题的原因,不是吗?我从未见过如此直接的错误消息。真的吗? 这些僵局又如何能寄托于此? 像DDL语句CREATE将是一个线索。在发出警报之前,是否可以指向任何输出或可以找到的一些数据可以佐证我的理论? 还是我正在运行跟踪标志或扩展事件,以识别发生死锁然后从DDL语句推论得出的结果? 纵观各种数据可能被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.