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

Ответы на вопрос(3)

Ваш ответ на вопрос