私の理解では、SELECTステートメントでNOLOCKを使用すると、コミットされていない/ダーティな行も読み取る可能性があります。しかし、SELECTクエリが高速に実行されるように、テーブルのNOLOCKヒントを利用したかったのです。
さて、テーブル上のNOLOCKは、「SET TRANSACTION ISOLATION LEVEL READ COMMITTED」とともに、コミットされた行のみ(SETのため)でNOLOCKの利点とより高速なSELECTクエリ(NOLOCKのため)を提供しますか?
はい、テーブルヒントは分離レベル設定を上書きするため、ダーティリードが発生します
テストが簡単
最初にこれを実行します
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はデフォルトの分離レベルであり、設定する必要はありません。
スナップショットアイソレーション を見てください。ダーティデータは返されませんが、ロックされません。