我想知道SELECT WITH (NOLOCK)如果影响该表的唯一其他查询是SELECT查询,在表上使用的好处是什么.
这是如何由SQL Server处理的?将一个SELECT查询块另一个SELECT查询?
我正在使用SQL Server 2012和Linq-to-SQL DataContext.
(编辑)
关于表现:
SELECT必须等待第一个SELECT完成SELECT吗?SELECT WITH (NOLOCK)?我的理解是,当在SELECT语句中使用NOLOCK时,它也可以读取未提交的/脏行.但我想利用表上的NOLOCK提示,以便我的SELECT查询能够快速运行.
现在,NOLOCK在桌上但是与"SET TRANSACTION ISOLATION LEVEL READ COMMITTED"一起给我NOLOCK优势和更快的SELECT查询(因为NOLOCK)只有提交的行(因为SET)?
我正在MS SQL Server上创建一个视图.我没有太多接触过MS SQL,也不熟悉NO LOCK提示.我理解它的作用,但我不知道是否需要在我的情况下使用它.我被问到是否应该包含它而我不知道.
在我用于创建视图的所有查询后,是否需要添加NO HINT?或者这对用户查询视图本身有什么影响?USER应该对查询添加NO LOCK吗?
任何关于最佳方法的指导和任何澄清表示赞赏!
我有一个关于使用的问题NOLOCK。
我知道NOLOCK提示并不总是最好的方法,但在某些情况下它非常有帮助。我并不是想养成一直使用它的坏习惯
我只是想了解它的确切行为。有这样一个不切实际的假设:正在更新 id = 10 的记录的进程UPDATE table1 SET status = 2 WHERE id = 10需要 30 秒来更新。同时我执行SELECT * FROM table1 WITH NOLOCK where id = 10
即使我的第一个查询在记录上有独占锁,我的 select 语句是否会读取该行,或者我的 select 查询是否会等到记录上没有锁才允许读取?
我想知道使用是否NOLOCK会导致延误。
免责声明:这不是关于NOLOCK问题的一般性问题(因此不是NOLOCK(Sql Server提示)错误做法的重复吗?); 这是一个特定的问题,关于NOLOCK和DISTINCT如何交互以试图更好地理解SQL Server的内部工作.
虽然看起来很奇怪,但在我看来,NOLOCK可能会导致DISTINCT在某种情况下失败.这是一个例子:
INSERT INTO TableA (ID)
SELECT DISTINCT ID
FROM TableB WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
以上示例偶尔会产生PK违规.以下是其他相关事实:
我的工作理论是:1)TableB上的更新与NOLOCK的使用相结合导致重复数据,2)优化器依赖于TableA在同一列上具有PK的事实,我们是DISTINCTing,因此不会t主动对正在返回的行执行DISTINCT操作,它只是假设行已经是不同的.
谁能证实这一点?如果是这样,这是设计,还是SQL Server中的错误?
我原本以为即使有脏读也有重复行的可能性,DISTINCT将是清理重复项的保证,但我看到的证据似乎表明不是这样.
在SQL Server 2008R2上看到此错误.
了解最终决策是业务决策,在SQL 2008 R2中运行的NOLOCK和READPAST之间的准确性考虑是什么?在讨论业务领域的变化之前,我想更好地理解.
我继承了许多查询,用于为管理报告创建数据视图.'WITH(NOLOCK)'被广泛使用但不一致.正在读取的数据来自广泛使用的应用程序的生产服务器,该应用程序不断更新.我们正在从SQL 2005服务器迁移到SQL 2008 R2服务器.这些报告希望数据比存档服务器上的24小时数据更新鲜.使用NOLOCK表明过去的决定; 存在冲突的可能性,并且可以接受一些准确性损失.数据用于填充仪表板以供人类意识/决策制定.
所有查询都是SELECT,具有数据视图登录的只读访问权限.大多数查询是单表,有几个2和3表连接.鉴于连接的低级别()似乎比SET TRANSACTION ISOLATION LEVEL {}更好的选择
表提示(Transact-SQL)http://msdn.microsoft.com/en-us/library/ms187373.aspx(以及关于SO的多个问题)说NOLOCK和/或READUNCOMMITTED可能有重复的读取问题,除了丢失锁定的记录.
READPAST看起来更准确,因为它只会错过锁定的记录,而不会有重复的可能性.但我不确定丢失锁定记录的级别是否与NOLOCK保持一致.
蒂姆·查普曼(Tim Chapman)有一篇很好的文章比较了这两篇文章,但它是在2007年写的,大部分评论都围绕着2000年和2005年,有一条评论指出READPAST在2008 R2中存在问题
参考
在SQL Server中使用NOLOCK和READPAST表提示(作者Tim Chapman)
编辑:
下面的两个答案中建议了快照隔离.快照隔离是数据库的依赖设置,此Q/A https://serverfault.com/questions/117104/how-can-i-tell-if-snapshot-isolation-is-turned-on描述了如何查看设置在数据库上就位.我现在知道它已被禁用,我正在阅读来自主要应用程序数据库的报告.无法更改设置.+ - 几率的准确度是可以接受的,应用程序(OLTP)的影响是不可接受的.大多数简单查询不需要锁定考虑因素,但在某些极端情况下,需要锁定考虑因素.随着SQL 2005的Snapshot隔离的出现,关于SQL 2008或更高版本中的NOLOCK和READPAST行为的信息很少.但他们仍然是我唯一的选择.
任何人都可以提出在SELECT语句上发出NOLOCK的充分理由吗?
我正在重构一些乱七八糟的存储过程,据我了解,SELECT语句上的NOLOCK几乎毫无用处。