13

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

4

2 回答 2

15

转发答案:


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

此查询在前一个查询完成后立即运行,可查看所有更新。

于 2009-11-05T17:35:45.730 回答
0

我最近花了很多时间来找出数据仓库构建过程的一些时间和阻塞问题。事实证明,由于加载仓库的数据的只读性质,我在 etl 的源数据查询中添加了 nolock 提示,以减少对 sql server 上锁升级的要求,并防止 etl 加载失败. 对于这个,我对 sql server 和应用程序几乎没有控制权。同样,这是一个有针对性的解决方案,我不建议作为一般规则广泛使用任何查询提示。与所有性能测试和审查一样,有一些关键领域需要查看以确定问题所在以及解决问题的最佳方法。

于 2009-11-05T17:35:18.937 回答