代码之家  ›  专栏  ›  技术社区  ›  Chris McCall

在SQL Server中的每个select上使用(nolock)会导致什么结果?

  •  13
  • Chris McCall  · 技术社区  · 15 年前

    我明白了 (nolock) 优化器提示允许“脏读”,但在什么非常具体的场景下,这是一个坏主意?我从未见过如此广泛地使用 (诺洛克) 在一个组织里,这让我紧张。我想要一个关于用户故事的解释。”保罗做A,彼得做B,X代替Y”。

    3 回复  |  直到 8 年前
        1
  •  15
  •   Community CDub    8 年前

    重发 this 回答:


    NOLOCK 意味着根本不上锁。

    您的查询可能会返回以前的部分数据 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 ,所有其他未更新的行(长度) )

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

    这个查询在前一个查询完成后运行,可以看到所有的更新。

        3
  •  -1
  •   marvinb    15 年前

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

    推荐文章