私はそれを実行している間、更新されている特定の行を防ぐためにROWLOCKを使用しようとしているが、問題はこれを実行している間、私は全くのテーブルを使用することができないということです。ROWLOCKロックエスカレーション
set transaction isolation level repeatable read;
go
begin try
begin transaction;
insert into tableB with(rowlock)
select * from tableA with(rowlock) where status = 1
commit transaction;
end try
begin catch
if xact_state() <> 0
begin
rollback transaction;
end
end catch;
私は走りましたこのトランザクションが実行されている間に両方のテーブルの挿入が行われ、コミットを待っていました。特定の行を読み書きするためにロックするのに、テーブルを使用可能にするにはどうすればよいですか?
レコードの場合、selectは数万のレコードを生成します。表には主キーがクラスター化されており、状況列には索引があります。
ロックエスカレーションに関するこのMSDNの記事は、http://msdn.microsoft.com/en-us/library/ms184286.aspxを参照してください。具体的には、「データベースエンジンは行またはキー範囲のロックをページロックにエスカレートせず、直接テーブルロックにエスカレートしません」とロックエスカレーションが発生するしきい値(〜5000ロック)があるという事実 – AdaTheDev
'これが実行されている間、あなたはTableAに挿入していますか? –