在SELECT查询了解SQL Server中锁(Understanding SQL Server L

2019-06-18 08:16发布

我想知道什么是使用效益SELECT WITH (NOLOCK)在桌子上,如果影响该表中唯一的其他查询是SELECT查询。

如何通过SQL服务器进行处理? 将一个SELECT查询块另一个SELECT查询?

我使用SQL Server 2012和LINQ到SQL DataContext

(编辑)

关于性能:

  • 将第2个SELECT必须等待第一个SELECT到如果使用的是锁定完成SELECT
  • 对一个SELECT WITH (NOLOCK)

Answer 1:

一个SELECT在SQL Server将放置在表行共享锁 -和第二SELECT也需要一个共享锁,而这些都是相互兼容。

因此,没有-一个SELECT不能阻止另一SELECT

什么WITH (NOLOCK)查询提示用于是能够阅读这是在被插入(由其它连接)的进程,尚未提交的数据。

如果没有查询提示,一个SELECT可能会阻止通过持续读取表INSERT (或UPDATE这个以行(也可能是整个表) 独占锁)语句,直到该操作的事务已被提交(或回滚)。

该问题WITH (NOLOCK)提示是:你可能会读取不打算在所有插入到底(如果数据行INSERT事务回滚) -让你如报告可能显示的数据是从来没有真正被提交到数据库。

有可能是有用的另一个查询提示- WITH (READPAST) 这指示SELECT命令就跳过它试图读取并专门锁定任何行。 该SELECT不会阻止,它将无法读取任何“脏”未提交的数据-但它可能会跳过某些行,如不显示在表中所有的行。



Answer 2:

在性能你继续把重点放在选择。
共享不会阻止读取。
共享锁块更新。
如果您有数百个共享锁它是要采取更新一段时间才能得到一个排它锁,因为它必须等待共享锁清除。

默认情况下一个选择(读)取共享锁。
共享(S)锁允许并发事务读取(SELECT)资源。
共享锁作为其它选择(1或1000)没有影响。

所不同的是如何相对于NOLOCK共享锁效应更新或插入操作。

而在资源共享存在(S)锁没有其他事务都不能修改数据。

共享锁块更新!
但是,NOLOCK不会阻止更新。

这可能对更新的性能产生巨大的影响。 这也影响到刀片。

脏读(NOLOCK)只是听起来脏。 你永远会得到部分数据。 如果更新正在改变约翰萨利你永远不会得到乔利。

我使用共享锁很多关于并发。 数据只要它是读的是陈旧的。 改变萨莉下一毫秒约翰的读是旧数据。 这被回滚约翰下一毫秒萨利的读是旧数据。 这是在毫秒级。 我有一个的DataLoader称取20小时,以运行,如果用户正在共享锁和4小时来运行是用户正在无锁。 在这种情况下导致数据共享锁是16小时陈旧。

不要使用nolocks错。 但他们有一个地方。 如果你要切当一个字节设置为1,然后将其设置为2时,支票开支票 - 不是为NOLOCK的时间。



Answer 3:

在我的工作中,我们有在同一时间多台PC机上运行,​​与几十万行的,有时甚至几百万行的非常大表非常大的系统。

当你在一个非常大的表的SELECT,假设你想知道一个用户在过去10年中取得的每一笔交易,并表的主键是不是建立一种有效的方式,查询可能需要几分钟的时间跑步。

然后,我们的应用程序可能我在很多用户的PC上运行的同时,访问同一个数据库。 所以,如果有人试图插入了另一个选择是读(在SQL中试图读取页)表,然后锁可以发生,这两个交易相互阻塞。

我们有一个“无锁”添加到我们的SELECT语句,因为它是在由很多用户在同一时间使用了大量的表的SELECT巨大,我们有锁定所有的时间。

我不知道如果我的例子是不够清楚吗? 这是一个活生生的例子。



Answer 4:

我要补充的一个重要注解。 每个人都在提的是, NOLOCK只读取脏数据。 这不是精确的。 也有可能你会得到相同的行两次或你读的过程中整个行被跳过。 原因是,你可以要求在同一时间一些数据SQL Server时重新平衡b树。

检查另一个线程

https://stackoverflow.com/a/5469238/2108874

http://www.sqlmag.com/article/sql-server/quaere-verum-clustered-index-scans-part-iii.aspx )

随着NOLOCK提示(或设置会话的隔离级别读取未提交的),你告诉的SQL Server,你不要指望一致性,所以有没有保证。 请记住,虽然是“不一致的数据”并不仅仅意味着你可能会看到在交易的中间状态后来被回滚未提交的更改,或数据的变化。 这也意味着,在扫描所有表/索引数据的SQL Server可能会失去的扫描位置,或者你可能最终得到相同的行两次的简单查询。



Answer 5:

SELECT WITH (NOLOCK)允许读未提交的数据,这相当于具有的READ UNCOMMITTED隔离级数据库上设置。 所述NOLOCK关键字允许更细粒度的控制不是设置在整个数据库上的隔离级别。

维基百科有一个有用的文章: 维基百科:隔离(数据库系统)

它也是在其他计算器文章详细讨论。



Answer 6:

无锁选择 - 将选择可能/可能不会被插入的记录。 你会读脏数据。

例如 - 可以说,一个事务插入1000行,然后失败。

当你选择 - 你会得到1000行。



文章来源: Understanding SQL Server LOCKS on SELECT queries