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

Chr*_*all 13 sql sql-server optimizer-hints

我得到(nolock)优化器提示允许"脏读",但在非常具体的情况下,这是一个坏主意?我从未(nolock)在组织中看到如此广泛的使用,这让我感到紧张.我想用用户故事来解释一下."保罗做A,彼得做B,X代替Y".

Qua*_*noi 15

重新回答这个答案:


NOLOCK 意味着根本没有锁.

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

比如,借记没有信用和这些东西.

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

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

---
18874367
Run Code Online (Sandbox Code Playgroud)

所有name的都有1.

然后我重新启动它并在查询中间更新了表:

UPDATE  master
SET     name = 'tt'
WHERE   id <= 10000

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

---
18874944
Run Code Online (Sandbox Code Playgroud)

我们可以看到,这个查询注意到577行更新(长度2),所有其他行都没有更新(长度1).

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

---
18884367
Run Code Online (Sandbox Code Playgroud)

此查询在上一个完成后运行,查看所有更新.

  • 对于很多问题,"42"是一个很好的答案:) (8认同)