2009-11-05 26 views

回答

13

轉貼this答案:


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 

而這個查詢,在前一個完成後運行,看到所有更新。

+1

不重新發布答案意味着問題重複? – AnthonyWJones 2009-11-05 17:49:04

+8

編號'42'對於許多問題是一個很好的答案:) – Quassnoi 2009-11-05 18:09:52

+2

你也可以提到這種行爲並不是唯一的'READ UNCOMMITTED' - 它可以發生在'READ COMMITTED'和'REPEATABLE READ'。它在更低的隔離級別上更可能。 – 2012-01-25 19:15:22

-1

我最近花了很多時間找出數據倉庫構建過程的一些時間並阻止了問題。事實證明,由於用於加載倉庫的數據的只讀屬性,我在etl的源數據查詢中添加了nolock提示,以減少sql服務器上鎖升級的需求並保持etl負載不發生故障。對於這一個我很少控制SQL服務器和應用程序。再次,這是一個有針對性的解決方案,我不推薦廣泛使用任何查詢提示作爲一般規則。像所有的性能測試和評估一樣,有一些關鍵的方面需要考慮來確定問題的出在哪裏,以及什麼可能是最好的攻擊方式。

+0

如果源數據是隻讀的,爲什麼它的問題,如果一個共享讀鎖放在它?也許我誤解了你寫的內容? – 2012-11-27 20:55:43

+0

這不是我的問題的答案,它是倡導NOLOCK作爲一種策略。與我正在尋找的東西相反。 -1。 – 2012-11-28 15:46:37

相關問題