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 строк за раз, в транзакцию, чтобы увидеть, какой тип блокировки вы считаете приемлемым.