トランザクション分離レベルが繰り返し可能なt-sqlのブロックを読み取り、内部でnolockを使用してselectを実行した場合の正味の効果を知っている人はいますか。
分離レベルがすでに設定されているため、nolockは無効になりますか?
予想どおり、クエリのテーブルヒントが優先されます。
これが私のテストスクリプトです:
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
ステートメントによってロックが取得されません。
言い換えると、トランザクションに分離レベルを設定すると、その分離レベルはトランザクション内のデフォルトになりますが、私が示したように、そのデフォルトはテーブルヒントによってオーバーライドできます。