1

行ロックを使用して、実行中に特定の行が更新されないようにしようとしていますが、これを実行している間はテーブルをまったく使用できないという問題があります。

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 は数万のレコードを生成します。テーブルにはクラスター化された主キーがあり、ステータス列にはインデックスがあります。

4

1 に答える 1

1

特定の行を個別にロックしようとすることはお勧めしません。解決しようとしているよりも多くの問題に遭遇することになると思います。説明したロックの問題が発生する理由は、テーブル内の行数と比較して、挿入される行数が原因です。ロックは、SQL Server の裁量により、行ロックからページ ロック、テーブル ロックへとエスカレートします。

進行中のロックの量を減らすために、はるかに小さなトランザクション バッチに行を挿入する方がはるかに良いと思います。つまり、トランザクションで一度に 100 行を挿入して、許容できるタイプのロック パフォーマンスが得られるかどうかを確認します。

于 2011-02-04T12:23:51.930 に答える