2009-06-19 113 views
17

使用「SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED」和NOLOCK之間有什麼區別?這個比那個好嗎?NOLOCK與事務隔離級別

+2

注意`NOLOCK`暗示在2012 MSSQL過時,用等價`READUNCOMMITTED`提示更換。 [來源](http://msdn.microsoft.com/en-us/library/ms187373.aspx)。 – Jeroen 2013-05-12 14:41:12

+0

建議的源代碼表示 - 在FROM子句中支持使用UPDATE或DELETE語句的目標表中的READUNCOMMITTED和NOLOCK提示將在未來的SQL Server版本中刪除。 `。它不會說`NOLOCK`已被棄用。目前,我相信`NOLOCK`和`READUNCOMMITTED`提示都可用。 – RBT 2016-08-23 10:52:34

回答

20

它們是相同的東西,只是作用域不同。 NOLOCK放置在每個桌子的基礎上,並且可以將SET Transaction...作爲塊放置。

+0

感謝您的確認! – Jason 2009-06-19 15:48:54

6

NOLOCK是查詢提示,因此僅適用於specifc表中被指定它的查詢中。

設置事務隔離級別適用於在當前連接內執行的所有代碼,或者直到它被明確修改。

爲了澄清,在功能上工作isoloation水平是其上覆蓋可能並不相同但是範圍。

4

that answer從幾個小時前,這個問題SQL Server SELECT statements causing blocking

報價Remus Rusanu

SELECT可以阻止更新。正確設計的數據模型和查詢只會造成最小的阻塞,而不是問題。 「常用」WITH NOLOCK提示幾乎總是錯誤的答案。正確的答案是調整您的查詢,以便它不掃描巨大的表。

如果查詢不可執行,那麼您應該首先考慮SNAPSHOT ISOLATION級別,其次您應該考慮使用DATABASE SNAPSHOTS並且最後一個選項應該是DIRTY READS(並且最好更改隔離級別而不是使用NOLOCK HINT)。請注意,如名稱明確指出的那樣,髒讀將返回不一致的數據(例如,您的總表可能不平衡)。

其他的答案可以幫助你。

1

它們具有相同的效果,只有一個用作鎖提示(NOLOCK),另一個被用於連接範圍。

要小心這些 - 髒讀取可能是一個非常糟糕的事情取決於您的應用程序。讀同一記錄兩次或因缺少運動頁的記錄可以是一個非常令人困惑的事情給用戶...