Sql-Server

為什麼 WITH NOLOCK 以可序列化方式執行

  • January 22, 2016

我執行了以下查詢:

SELECT session_id,CASE transaction_isolation_level 
WHEN 0 THEN 'Unspecified' 
WHEN 1 THEN 'ReadUncommitted' 
WHEN 2 THEN 'ReadCommitted' 
WHEN 3 THEN 'Repeatable' 
WHEN 4 THEN 'Serializable' 
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
FROM sys.dm_exec_sessions 
Where transaction_isolation_level = 4 

然後:

DBCC INPUTBUFFER(157)

其中 157 是先前的 session_id 之一,以查看查詢號的結果之一的語句。1.

它顯示了以下內容:

(@ID uniqueidentifier) SELECT * FROM PS WITH (NOLOCK) WHERE ID = @ID

WITH (NOLOCK)使用隔離級別 Serializable的語句如何執行?有什麼“壓倒一切”的With (NOLOCK)嗎?

鎖定提示與隔離級別正交。雖然它們解決了類似的問題,但添加鎖定提示不會改變隔離級別。您的交易仍將是“可序列化”交易。當然,鎖提示使查詢操作本身違反了事務的可串列性,但是您正在查看事務的一個屬性。

您的查詢正在報告事務隔離級別的會話級別設置,該設置設置為可序列化。

使用NOLOCK提示(或其同義詞READUNCOMMITTED)會覆蓋會話隔離級別,以訪問指定提示所針對的特定對象(在本例中為表)。

因此,事務仍然在可序列化隔離下執行,但對錶 PS 的訪問將使用READUNCOMMITTED隔離語義執行。

文件:

相關閱讀:

引用自:https://dba.stackexchange.com/questions/126969