为什么 WITH NOLOCK 作为可序列化运行

Mag*_*ier 3 sql-server sql-server-2008-r2 isolation-level 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 
Run Code Online (Sandbox Code Playgroud)

进而:

DBCC INPUTBUFFER(157)
Run Code Online (Sandbox Code Playgroud)

其中 157 是先前的 session_id 之一,以查看查询编号之一的结果的语句。1.

它显示了以下内容:

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

如何使用WITH (NOLOCK)隔离级别 Serializable 运行语句?有什么“覆盖”的With (NOLOCK)吗?

Rem*_*anu 8

锁定提示与隔离级别正交。虽然他们解决类似的担忧,增加了锁提示并不会改变隔离级别。您的交易仍将是“可序列化”的交易。当然,锁定提示使查询操作本身违反了事务的可序列化性,但是您正在查看事务的一个属性。


Pau*_*ite 8

您的查询正在报告事务隔离级别的会话级别设置,该级别设置为可序列化。

使用NOLOCK提示(或其同义词READUNCOMMITTED)会覆盖会话隔离级别,以访问指定提示所针对的特定对象(在本例中为表)。

因此,事务仍然在可序列化隔离下运行,但对表 PS 的访问将使用READUNCOMMITTED隔离语义执行。

文档:

相关阅读: