gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:04:34 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com