次のクエリを実行しました。
_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)
を「オーバーライド」するものはありますか?
ロックヒントは分離レベルに直交しています。それらは同様の懸念に対処しますが、ロックヒントを追加するとnotが分離レベルを変更します。 transactionは「シリアライズ可能」なトランザクションです。もちろん、ロックヒントはクエリ操作自体をトランザクションのシリアル化可能性に違反させますが、transactionのプロパティを見ています。
クエリは、シリアル化可能に設定されているトランザクション分離レベルのセッションレベル設定を報告しています。
NOLOCK
ヒント(またはその同義語READUNCOMMITTED
)を使用すると、ヒントが指定されている特定のオブジェクト(この場合はテーブル)にアクセスするためのセッション分離レベルが上書きされます。
したがって、トランザクションは引き続きシリアライズ可能な分離で実行されていますが、テーブルPSへのアクセスはREADUNCOMMITTED
分離セマンティクスで実行されます。
ドキュメンテーション:
関連読書: