Может ли кто-нибудь помочь мне в тупике в SQL Server 2005?
Для простого теста у меня есть таблица "Книга", которая имеет первичный ключ (id) и имя столбца. Индекс по умолчанию этого первичного ключа некластеризованный.
Тупик происходит, когда два сеанса работают одновременно. Монитор активности показывает первый сеанс "//шаг 1" блокирует строку (блокировку блокировки) с блокировкой X. Второй сеанс блокирует блокировку строки U и блокировку ключа U. Изображение тупика показывает, что "//step2" для первого сеанса требует блокировки ключа U.
Если индекс кластеризованный, в этом случае нет взаимоблокировки. "//шаг 1" будет поддерживать блокировку строк и клавиш одновременно, поэтому проблем нет. Я понимаю, что блокировка строки также блокирует индекс, так как leaf node кластерного индекса - это данные строки.
Но почему именно некластеризованный индекс? Если второй сеанс содержит блокировку ключа 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