2010-11-01 63 views
4

考慮下面的更新語句:在UPDATE語句中,是否在FROM子句中使用NOLOCK提示?

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) 

請問(NOLOCK)上TABLE_1和TABLE_2暗示兌現?

回答

8

是否兌現TABLE_1和TABLE_2上的(NOLOCK)提示?

是的,他們會。

請注意,一般來說,這種行爲是非常錯誤如果您認爲您真的需要這個,最有可能的是,您應該重新設計您的數據庫和/或應用程序。

NOLOCK提示的目的是什麼?爲什麼你想用髒數據更新你的表變量?

+1

+1 - 比我的更完整。不過要注意的是,任何DDL交易仍然需要鎖定並且會被阻止。 – JNK 2010-11-01 15:17:48

+0

如果我在嘗試在查詢運行時將一列添加到'TABLE_1',它不會阻止它? – JNK 2010-11-01 15:24:14

+0

@JNK:哦,對不起,與'DML'混淆:)當然會。 – Quassnoi 2010-11-01 15:27:08

1

NoLock提示幾乎以任何方式提高服務器生產力。但是,當訪問數據的時候,可以安全地使用(NOLOCK)提示,以保證在此刻不會改變(例如,一旦數據部分發布到數據庫,數據部分將保持不變或者您知道當前部分數據不會更改由其他用戶提供)或者採用舊數據或新數據無關緊要(例如,某些數據經常變化,並且無論如何不需要精確保存最新數據)。 以其他方式,您可能會在不同表格中發現數據發散...