5

トランザクションに対してシリアル化可能なトランザクション分離ロックを設定しましたが、予期しない結果がいくつか見られます。

私のクエリは

update tabl1 set col2 = 10 where col1 > 10 and col1 < 20

ここで、col1 は主キーです。ここでは、col1 の値が 10,11,12....19,20 の行が更新/挿入のためにロックされています。where 条件では、col1>10 および col1<20 として条件を指定しましたが、それでも col1=10 および col1=20 の行がロックされます。

私が与えるなら

update tabl1 set col2 = 10 where col1 => 10 and col1 <= 20

次に、col2 の値が 9 から 21 の行がロックされます。では、なぜ col1 の値が 9 と 21 でここでロックされるのでしょうか。

以下のクエリでは、テーブル全体がロックされます。ここで、col3 は非プライマリ カラムです。WHERE 条件のカラムがプライマリ キーでない場合、ロックを設定できませんか?

update tabl1 set col2 = 10 where col3 > 10 and col3 < 20
4

1 に答える 1

4

キー範囲ロックの場合、SQL Server は範囲条件を満たすためにインデックスを使用する必要があるため、最後のクエリに関しては、インデックスが必要にcol3なります (プランで使用されていない場合は、その使用を強制するためのクエリ ヒントが必要になる可能性があります)。

WHEREまた、句の特定の範囲をロックするだけではありません。鍵をロックします。キーの範囲ロックは、そのキーから次のキーまでの範囲を保護するため、ブロックされる正確な範囲は、インデックスに存在するキーによって異なります。

詳細/リンクはこちらの回答にあります

于 2013-01-07T10:33:26.323 に答える