2016-07-27 1 views
0

与えられた二つのトランザクション:繰り返し可能な読み取り分離レベルは、すべてのテーブルを更新してロックしますか?

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

答えて

0

ファーストで行を読み取ろうとする場合にのみsencond 1がブロックされますDDL、DML文には決して影響しません。選択されたものだけに適用されます.2番目の更新では、インデックスがない(テーブルスキャンなので)テーブルロックを解除しない限り、テーブル全体をブロックしません。

あなたはブロックしていますあなたの例は、トランザクションがコミットされるまで選択共有ロックをそのまま維持する反復可能読み取り分離レベルによるものです


1.Selectはテーブルをブロックすることはありませんが、トランザクションが終了するまでテーブルの競合するロックは許可されません。
2.更新が5,000を超えるロックを取得した場合、テーブル(選択さえしていない)

+0

私は他のトランザクションが一部の行を変更するのを防ぐために、繰り返し可能な読み取りに頼っています。しかし、それはすべてのテーブルをロックするのはなぜですか?読み込まれた行だけをロックする必要はありませんか? – DotNetter

+0

繰り返し可能な読み取りは読み取り中の行のみをロックし、シリアライズ可能なのは範囲のロックを取得してトランザクションが終了するまで – TheGameiswar

+0

テーブルがブロックされている理由を確認するsys.dm_tran_locksを参照してください – TheGameiswar

関連する問題