web-dev-qa-db-ja.com

繰り返し可能な読み取りとnolock

トランザクション分離レベルが繰り返し可能なt-sqlのブロックを読み取り、内部でnolockを使用してselectを実行した場合の正味の効果を知っている人はいますか。

分離レベルがすでに設定されているため、nolockは無効になりますか?

5
blakmk

予想どおり、クエリのテーブルヒントが優先されます。

これが私のテストスクリプトです:

CREATE TABLE t1 (a int);

INSERT INTO t1(a) SELECT TOP 1000 message_id FROM sys.messages;


SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

BEGIN TRANSACTION;

    SELECT * FROM t1 WITH(NOLOCK); /* Try it with and without the hint */

    EXEC sp_lock;

ROLLBACK;

NOLOCKヒントが含まれていると、SELECTステートメントによってロックが取得されません。

言い換えると、トランザクションに分離レベルを設定すると、その分離レベルはトランザクション内のデフォルトになりますが、私が示したように、そのデフォルトはテーブルヒントによってオーバーライドできます。

2
Jon Seigel