【问题标题】:In the UPDATE statement, are NOLOCK hint honored in the FROM clause?在 UPDATE 语句中,在 FROM 子句中是否遵循 NOLOCK 提示?
【发布时间】:2011-05-03 11:24:22
【问题描述】:

鉴于以下更新声明:

UPDATE @TableVariable
SET city = T2.city
FROM @TableVariable TV
INNER JOIN dbo.TABLE_1 T1 WITH (NOLOCK)
    ON  (TV.customer_id = T1.customer_id)
INNER JOIN dbo.TABLE_2 T2 WITH (NOLOCK)
    ON  (T1.address_id = T2.address_id)

TABLE_1 和 TABLE_2 上的 (NOLOCK) 提示是否有效?

【问题讨论】:

    标签: sql-server sql-server-2000 nolock hints


    【解决方案1】:

    TABLE_1 和 TABLE_2 上的 (NOLOCK) 提示是否有效?

    是的,他们会的。

    请注意,一般来说,这种行为非常错误,如果您认为您确实需要这样做,很可能您应该重新设计您的数据库和/或应用程序。

    NOLOCK 提示的目的是什么?为什么要用脏数据更新表变量?

    【讨论】:

    • +1 - 比我的更完整。但需要注意的是,任何 DDL 事务仍然需要锁定并且会被阻止。
    • 如果我在他的查询运行时尝试向TABLE_1 添加一列,它不会阻止它吗?
    • @JNK:哦,抱歉,与DML 混淆了:)当然会的。
    • 不!从 SQL2005 开始,NoLocks 和 READUNCOMMITTED 表提示在更新和删除语句中被忽略。 technet.microsoft.com/en-us/library/ms143729(v=sql.90).aspx
    • @Brian:是的。提示仅在应用于 DML 语句的目标表时才会被忽略。
    【解决方案2】:

    NoLock 提示几乎以任何方式提高了服务器的工作效率。但是,在访问数据时可以安全地使用 (NOLOCK) 提示,或者保证在那个时刻不会发生变化(例如,一旦数据部分发布到 DB 它将保持不变,或者您知道当前数据部分不会被更改由其他用户),或者如果获取旧数据或新数据都没有关系(例如,某些数据经常更改,并且无论如何都不需要保存最新的数据)。 以其他方式,您可能会得到不同表中的数据差异...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多