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