我在msdn中浏览了一些文档,它说“不会发出共享锁来防止其他事务修改当前事务读取的数据”。
所以用外行术语(即我的)来说,这会导致脏读问题。哪个太危险了,如果是的话为什么要使用它?
有谁知道它的实际使用场景吗?
最佳答案
在我们的案例(之前的工作)中,我们使用它来获取大概的数字。例如,一个表包含在某一天发送的数百万封电子邮件,如果在 5:00 我们想要查看“我们在哪里”,我们可以说:
SELECT COUNT(*) FROM dbo.MessageTable WITH (NOLOCK)
WHERE CampaignID = x AND CustomerID = y;
很多人会建议将其用于没有 WHERE
子句的 COUNT(*)
。我认为,如果您愿意接受 COUNT(*)
中的一些不准确之处,您也可以这样做:
SELECT SUM(rows) FROM sys.partitions
WHERE [object_id] = OBJECT_ID('dbo.tablename')
AND index_id IN (0,1);
由于正在进行的事务,这个数字同样不准确,但实际上不需要扫描表,因此它的效率要高得多。对于我们的例子,我们甚至可以对子集使用它:有了过滤索引(用于其他目的),我们可以类似地查询 sys.partitions ,但使用过滤后的index_id索引。
尽管如此,在大多数情况下,使用 NOLOCK
可能感觉就像一个涡轮按钮,但它可能导致的不准确性很少值得。除非您的系统已经受到 tempdb 的严重限制,否则您应该考虑将 READ_COMMITTED_SNAPSHOT
用于当前的 NOLOCK
场景。请参阅Pros and cons of READ_COMMITTED_SNAPSHOT
关于sql - sql server中nolock的实际用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10896368/