Повторные испытания после
--3)
create index IX_aaa_ID on aaa(id)
ВЫБРАТЬ 2) все еще заблокирован
--4)
drop index IX_aaa_ID on aaa
create unique index IX_aaa_ID on aaa(id)
--or adding primary key constraint
ВЫБРАТЬ 2) НЕ заблокирован
Если изменить 2) как
--2b)
select * from aaa
where id=3
--or as
--WHERE id=2
показывает, что 2b) не блокируется даже при отсутствии какого-либо индекса или PK.
Хотя, 2b), без каких-либо индексов, блокируется после изменения 1) UPDATE для запуска под сериализуемым
но не в режиме повторного чтения или ниже
--1c)
set transaction isolation level serializable;
--set transaction isolation level REPEATABLE READ;
begin transaction;
update aaa set Name ='bbb'
where id=1;
--rollback
Итак, похоже, что попытки выбора нескольких строк для получения не разделяемой блокировки?
Обновление:
Что ж, во всех случаях блокировка SELECT ожидает получения LCK_M_IS
Хорошая причина понять эту кухню
Update2:
Ну, это не блокировка UPDATE, которая эскалируется в таблице, это блокировки SELECT (общие) (когда SELECT пытается прочитать несколько строк), которые эскалируются в блокировку таблицы и не могут быть предоставлены, потому что таблица уже исключена (UPDATE). ) замок.
И наличие или отсутствие индекса не было связано с моим основным вопросом
Я перенес обсуждение этой темы на мое предложение «Намеренные блокировки строк не следует переводить в блокировку таблицы, если таблица уже содержит монопольную блокировку»