【问题标题】:NOLOCK vs. Transaction Isolation LevelNOLOCK 与事务隔离级别
【发布时间】:2009-06-19 15:40:46
【问题描述】:

使用“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”和NOLOCK有什么区别?一个比另一个好?

【问题讨论】:

  • 请注意,NOLOCK 提示在 MSSQL 2012 中已弃用,将替换为等效的 READUNCOMMITTED 提示。 Source.
  • 建议来源说 - Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL Server. 。它并没有说 NOLOCK 已被弃用。我相信目前NOLOCKREADUNCOMMITTED 提示都可用。

标签: sql sql-server transaction-isolation


【解决方案1】:

它们是相同的东西,只是范围不同。 NOLOCK 是按表放置的,SET Transaction... 可以作为一个块放置。

【讨论】:

  • 是不是相当于在正在执行的sql的所有表中都放了nolock?
【解决方案2】:

NOLOCK 是一个查询提示,因此仅适用于指定它的查询中的特定表。

设置事务隔离级别适用于在当前连接中执行的所有代码,或者直到它被显式修改。

澄清一下,工作中的隔离级别在功能上是相同的,但涵盖的范围可能不同。

【讨论】:

    【解决方案3】:

    见几个小时前的that answer,到问题SQL Server SELECT statements causing blocking

    引用Remus Rusanu:

    SELECT 可以阻止更新。正确设计的数据模型和查询只会导致最小的阻塞,而不是问题。 '通常' WITH NOLOCK 提示几乎总是错误的答案。正确的答案是调整您的查询,使其不会扫描大表。

    如果查询不可调,则应首先考虑 SNAPSHOT ISOLATION 级别,其次应考虑使用 DATABASE SNAPSHOTS,最后一个选项应为 DIRTY READS(最好更改隔离级别而不是使用 NOLOCK HINT)。请注意,脏读,顾名思义,会返回不一致的数据(例如,您的总工作表可能不平衡)。

    其他答案也可能对您有所帮助。

    【讨论】:

    • 只是我的意见,但此处提供的参考资料并未回答发布的问题。
    • 不完全是,是​​的,但我认为它可能会有所帮助,因为它将 NOLOCK 与其他隔离方法进行了比较。
    【解决方案4】:

    它们的作用相同,只有一个用作锁定提示(nolock),另一个用作连接范围。

    请小心其中任何一个 - 脏读可能是一件非常糟糕的事情,具体取决于您的应用程序。由于页面移动而读取相同的记录两次或丢失一条记录对用户来说可能是一件非常令人困惑的事情......

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2013-08-27
      相关资源
      最近更新 更多