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;

Я выполнил вставку для обеих таблиц во время выполнения этой транзакции, и они оба ждали ее фиксации. Что я должен сделать, чтобы заблокировать определенные строки для чтения и удаления, но сохранить таблицы пригодными для использования?

Для записи выберите результаты десятки тысяч записей. Таблицы имеют кластерные первичные ключи, а столбец состояния имеет индекс.

1 ответ

Я не рекомендовал бы пытаться индивидуально заблокировать определенные строки. Я думаю, что вы столкнетесь с большим количеством проблем, чем пытаетесь решить. Причина, по которой вы столкнулись с проблемой блокировки, которую вы описали, заключается в количестве вставляемых строк по сравнению с количеством строк в вашей таблице. Блокировки увеличиваются от блокировок строк до блокировок страниц и блокировок таблиц по усмотрению SQL Server.

Я думаю, что вам будет гораздо лучше вставлять строки в гораздо меньшие пакеты транзакций, чтобы уменьшить количество выполняемых блокировок. Другими словами, пытаясь вставить 100 строк за раз, в транзакцию, чтобы увидеть, какой тип блокировки вы считаете приемлемым.

Другие вопросы по тегам