与えられた二つのトランザクション:繰り返し可能な読み取り分離レベルは、すべてのテーブルを更新してロックしますか?
T1
set transaction isolation level repeatable read;
begin transaction
select * from tmp where val=1;
update tmp set txt='rerwer11' where val=1;
waitfor delay '00:00:7';
commit;
T2
set transaction isolation level repeatable read;
begin transaction
select * from tmp where val=2;
update tmp set txt='rerwer11' where val=2;
commit;
スタートT1、それは打ち上げにT2を実行している間。私は、最初のトランザクションはval=1
の行だけをロックすると考えていたため、他の行を処理するために2番目のトランザクションをブロックする必要はありません。しかし、2番目のトランザクションが最初に完了するのを待つことが判明しました。 私はそれらの両方のためのデフォルトの分離レベルを(コミット読み取り)を使用してxlock
ヒントとupdate
を実行すると、私は期待のように、すべての作品:それはすべての分離レベルのval=1
私は他のトランザクションが一部の行を変更するのを防ぐために、繰り返し可能な読み取りに頼っています。しかし、それはすべてのテーブルをロックするのはなぜですか?読み込まれた行だけをロックする必要はありませんか? – DotNetter
繰り返し可能な読み取りは読み取り中の行のみをロックし、シリアライズ可能なのは範囲のロックを取得してトランザクションが終了するまで – TheGameiswar
テーブルがブロックされている理由を確認するsys.dm_tran_locksを参照してください – TheGameiswar