Может кто-нибудь помочь мне в тупике в SQL Server 2005?
Для простого теста у меня есть таблица «Книга», в которой есть первичный ключ (id) и имя столбца. Индекс по умолчанию для этого первичного ключа: некластеризованный .
тупик возникает, когда две сессии запускаются одновременно. Монитор активности показывает, что первый сеанс "// шаг 1" блокирует строку (освобождает блокировку) с помощью X-блокировки. Второй сеанс сохраняет блокировку строки U и блокировку ключа U. На рисунке тупика показано, что «// step2» первого сеанса требует блокировки ключа U.
Если индекс кластеризован , в этом случае тупиковая ситуация отсутствует. «// шаг 1» сохранит блокировку строки и ключа одновременно, поэтому проблем нет. Я понимаю, что блокировка строки также заблокирует индекс, поскольку конечный узел кластерного индекса - это данные строки.
Но почему некластеризованный индекс именно таким образом? Если во втором сеансе удерживается блокировка ключа U, то почему «шаг 1» первого сеанса не удерживает эту блокировку, поскольку они совпадают с оператором обновления.
--// first session
BEGIN TRAN
update Book set name = name where id = 1 //step 1
WaitFor Delay '00:00:20'
update Book set name = 'trans' where id = 1 //step2
COMMIT
--// second session
BEGIN TRAN
--// this statement will keep both RID(U lock) and KEY(U lock) if first session did not use HOLDLOCK
update Book set name = name where id = 1
COMMIT