sql - 在 SQL Server 中的每个 SELECT 上使用 (nolock) 会发生什么?

标签 sql sql-server optimizer-hints

我知道 (nolock)优化器提示允许“脏读”,但在哪些非常具体的情况下这是一个坏主意?我从未见过如此广泛使用 (nolock)在一个组织中,这让我很紧张。我想要一个关于用户故事的解释。 “保罗做 A,彼得做 B,X 发生而不是 Y”。

最佳答案

转发 this回答:
NOLOCK意味着根本不放置锁。

您的查询可能会返回之前的部分数据 UPDATE和之后的部分 UPDATE在单个查询中。

比如,没有信用的借记卡之类的东西。

例如,我只是在一个大表上运行了这个查询:

SELECT  SUM(LEN(name))
FROM    master WITH (NOLOCK)
OPTION (MAXDOP 1)

---
18874367

全部 name的长度为 1 .

然后我重新运行它并在查询的中间更新了表:
UPDATE  master
SET     name = 'tt'
WHERE   id <= 10000

SELECT  SUM(LEN(name))
FROM    master WITH (NOLOCK)
OPTION (MAXDOP 1)

---
18874944

如我们所见,此查询注意到 577行已更新(长度 2 ),所有其他行未更新(长度 1 )。
SELECT  SUM(LEN(name))
FROM    master WITH (NOLOCK)
OPTION (MAXDOP 1)

---
18884367

而这个查询,在上一个完成后立即运行,查看所有更新。

关于sql - 在 SQL Server 中的每个 SELECT 上使用 (nolock) 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682240/

相关文章:

sql - PL/SQL错误: ORA-00984 Column not allowed here

mysql - 从两个相似表中获取数据的 SQL 查询

sql-server - 将数据库部署到 SQL Azure 时出错

oracle - 如何在 Oracle 中强制按索引 rowid 访问?

sql - 从 SQL Server 获取数据库用户列表及其权限

sql - 对一组列的 NOT NULL 约束

sql - 排名:如何将 ROW_NUMBER 或 RANK 重置为 1

sql - 使用 INNER JOIN 更新 SQL Server 中的多个表

c++ - 如何更快地编译和启动 VSC++ 项目?