Sql-Server
為什麼 WITH NOLOCK 以可序列化方式執行
我執行了以下查詢:
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
隔離語義執行。文件:
相關閱讀:
- SQL Server 隔離級別:A 系列(我是作者)