12

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

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

4

1 に答える 1

19

はい、テーブル ヒントは分離レベル設定をオーバーライドするため、引き続きダーティ リードが発生します。

テストしやすい

最初にこれを実行します

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 はデフォルトの分離レベルです。設定する必要はありません。

ダーティーなデータは返さないがロックはしないSnapshot Isolationを見てみましょう

于 2010-10-04T16:16:35.550 に答える