行ロックを使用して、実行中に特定の行が更新されないようにしようとしていますが、これを実行している間はテーブルをまったく使用できないという問題があります。
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 は数万のレコードを生成します。テーブルにはクラスター化された主キーがあり、ステータス列にはインデックスがあります。