web-dev-qa-db-ja.com

SELECTステートメント-SETTRANSACTION ISOLATION LEVEL READCOMMITTEDを使用したNOLOCK

私の理解では、SELECTステートメントでNOLOCKを使用すると、コミットされていない/ダーティな行も読み取る可能性があります。しかし、SELECTクエリが高速に実行されるように、テーブルのNOLOCKヒントを利用したかったのです。

さて、テーブル上のNOLOCKは、「SET TRANSACTION ISOLATION LEVEL READ COMMITTED」とともに、コミットされた行のみ(SETのため)でNOLOCKの利点とより高速なSELECTクエリ(NOLOCKのため)を提供しますか?

12
Dave

はい、テーブルヒントは分離レベル設定を上書きするため、ダーティリードが発生します

テストが簡単

最初にこれを実行します

create table bla(id int)
insert bla values(1)



begin tran
select * from bla with (updlock, holdlock)

トランをコミットしないでください!別のウィンドウを開いてこれを実行します

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

select * from bla -- with (nolock)

何も返されません。

別のウィンドウを開いて、今すぐ実行してください

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

select * from bla with (nolock)

あなたが見ることができるようにあなたは列を取り戻すでしょう

ところで、READ COMMITTEDはデフォルトの分離レベルであり、設定する必要はありません。

スナップショットアイソレーション を見てください。ダーティデータは返されませんが、ロックされません。

18
SQLMenace