sql - sql server中nolock的实际用途是什么

标签 sql sql-server sql-server-2008

我在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/

相关文章:

sql - postgresql 查询以选择表中不存在于另一个表的链接中的行

c# - SQL从nVarchar到int的转换报错

sql-server - 将 ssis 中的 sql server 查询输出导出到文本文件,包括列标题

sql - 元组关系演算中的聚合函数

SQL 查询 - 不同的还是唯一的?

sql - 聚合 SQL 结果,两个表,然后汇总结果

sql - 从 SQL Server 中删除所有用户定义的类型

sql-server-2008 - 如何在分区中使用多列并确保不返回重复行

sql - 使用nodejs SQL DB2插入海量数据

c# - 从 SQL 读取数百万条记录,处理它们并将它们插入到另一个 SQL 服务器