web-dev-qa-db-ja.com

WITH NOLOCKがSerializableとして実行されている理由

次のクエリを実行しました。

_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つで、クエリnoの結果の1つのステートメントを表示します。 1。

それは以下を示しました:

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

WITH (NOLOCK)を使用するステートメントは、分離レベルSerializableでどのように実行できますか? With (NOLOCK)を「オーバーライド」するものはありますか?

3
Magier

ロックヒントは分離レベルに直交しています。それらは同様の懸念に対処しますが、ロックヒントを追加するとnotが分離レベルを変更します。 transactionは「シリアライズ可能」なトランザクションです。もちろん、ロックヒントはクエリ操作自体をトランザクションのシリアル化可能性に違反させますが、transactionのプロパティを見ています。

8
Remus Rusanu

クエリは、シリアル化可能に設定されているトランザクション分離レベルのセッションレベル設定を報告しています。

NOLOCKヒント(またはその同義語READUNCOMMITTED)を使用すると、ヒントが指定されている特定のオブジェクト(この場合はテーブル)にアクセスするためのセッション分離レベルが上書きされます。

したがって、トランザクションは引き続きシリアライズ可能な分離で実行されていますが、テーブルPSへのアクセスはREADUNCOMMITTED分離セマンティクスで実行されます。

ドキュメンテーション:

関連読書:

8
Paul White 9