2009-11-12 28 views
17

NOLOCK我已經看到了使用NOLOCK和使用SQL語句(NOLOCK) e.g -語法在SQL

select * from table1 nolock where column1 > 10 

select * from table1 with(nolock) where column1 > 10 

其中,上述說法是正確的,爲什麼呢?

回答

6

它們在技術上都是正確的,但是從SQL 2005開始的not using the WITH keyword has been deprecated,所以習慣使用WITH關鍵字 - 簡短答案,使用WITH關鍵字。

+0

確定如此(nolock)幾乎已成爲sql 2005的新語法,儘管nolock本身仍然有效。是嗎? – seenasan 2009-11-12 17:26:39

+0

是的,仍然沒有「與」的作品,但它已被棄用,這意味着它將不會在未來的某個時間點的發佈中以這種方式工作(可能是下一個版本,可能是之後的版本,可以從現在開始是10)... – chadhoc 2009-11-12 17:28:12

+0

還有關於插入,更新應該以(nolock)作爲編程規範嗎? – seenasan 2009-11-12 17:35:26

5

使用「WITH(NOLOCK)」。

27

第一條語句不鎖定任何內容,而第二條語句不鎖定任何內容。當我測試了這一點剛纔SQL Server 2005上,在

select * from table1 nolock where column1 > 10 --INCORRECT 

「NOLOCK」成爲別名,該查詢中,表1中。

select * from table1 with(nolock) where column1 > 10 

執行期望的nolock功能。持懷疑態度?在一個單獨的窗口中,運行

BEGIN TRANSACTION 
UPDATE tabl1 
set SomeColumn = 'x' + SomeColumn 

鎖定表,然後嘗試每個鎖定語句在其自己的窗口中。第一個會掛起,等待鎖釋放,第二個會立即運行(並顯示「髒數據」)。不要忘了問題

ROLLBACK 

當你完成。

+0

+1爲了捕捉(nolock)與nolock - 關於別名的區別的區別。區別應該是使用「(nolock)vs(nolock)」而不是「nolock vs. with(nolock)」,正如問題中所示 - 好的catch – chadhoc 2009-11-12 18:14:11

18

的棄用功能列表是Deprecated Database Engine Features in SQL Server 2008

  • 指定NOLOCK或READUNCOMMITTED 在從更新的條款或 DELETE語句。
  • 指定表 提示不使用WITH關鍵字。
  • HOLDLOCK表提示無 括號
  • 使用空格作爲表提示之間的分隔符。
  • 表提示間接應用於通過視圖調用多語句表值函數(TVF)。

他們都在那有時會SQL的下一個版本之後被移除的功能列表,這意味着只有在一個較低的數據庫兼容級別,他們將很有可能在enxt版本將支持。

話雖這麼說,我在這個問題上2c是這樣:

  • 兩個from table nolockfrom table with(nolock)是錯誤的。如果您需要髒讀,則應使用適當的transaction isolation級別:set transaction isolation level read uncommitted。這樣,所使用的islation級別是從一個「旋鈕」明確陳述和控制的,而不是通過源頭分散出來,並受到表提示的所有怪癖(通過視圖和TVF等間接應用)。
  • 骯髒的讀取是一個abonimation。在99.99%的情況下,需要減少爭用,而不是讀取未提交的數據。通過針對精心設計的模式編寫適當的查詢來減少爭用,並在必要時通過部署快照隔離來降低爭用。最好的解決辦法,能解決的作品幾乎總是節省一些極端的情況下,是在數據庫enable read commited snapshot,讓發動機工作時它的魔力:

    ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

然後將其刪除所有提示選擇。

+1

+1對於一些事情,第一次注意到FROM中更新/刪除了nolock的棄用 - 非常好。儘管我不完全同意髒讀是一種可憎的行爲(有些情況下它可以使用,即使是閱讀承諾的樂觀方法),但我確實認爲它被過度使用,誤解,並且存在,很少的情況下,它是有道理的,甚至在實際理解使用的地方更少。 – chadhoc 2009-11-12 21:28:11

+0

我同意髒讀有他們的用途,但可以說我喜歡用戲劇性的效果來強調信息。 – 2009-11-12 21:48:29

+0

對於多個版本的SQL Server,NOLOCK已被列爲「下一版本的SQL Server中不支持的功能」。 2008年,2014年和2016年。 – 2017-03-14 19:42:34

0

兩者在語法上都是正確的。

NOLOCK將成爲table1的別名。

WITH(NOLOCK)經常被用作加速數據庫讀取的神奇方式,但我儘量避免使用它。

結果集可以包含尚未提交的行,這些行通常稍後會回滾。

錯誤或結果集可能爲空,可能缺少行或多次顯示相同的行。

這是因爲其他交易在您讀取數據的同時正在移動數據。

READ COMMITTED增加了一個額外的問題,其中數據在多個用戶同時更改同一個單元的單個列中損壞。

還有其他的副作用,導致犧牲了你希望首先獲得的速度增加。

現在你知道了,不要再使用它了。