- процесс 9196a8 имеет слот страницы 151867 174 в режиме X и хочет, чтобы слот страницы 3130302 31 в режиме S
- процесс 88b5b8 имеет слот страницы 313022 в режиме X и хочет слот 174 страницы 151867 в режиме S
- два удаления выполняются в
isolationlevel="repeatable read (3)"
Таким образом, в базовой куче таблицы возникает взаимоблокировка (блокировки RID вместо блокировок ключей подразумевают кучу, а не Btree).Высокий уровень изоляции (вероятно, вызванный DTC, судя по названию xact) делает настройку RCSI неактуальной.
Какого типа столбцы PARTYEXTERNALREF и PARTYTYPE?Передаваемыми параметрами являются NVARCHAR (т. Е. Unicode), и если столбцы VARCHAR (т. Е. Ascii), то из-за правил приоритет типа данных индекс NC не будет использоваться.Из-за задействованного сканирования таблиц и высокого уровня изоляции тупиковая ситуация практически неизбежна.
Решением будет использование параметров типа VARCHAR для @ P0 и @ P1, чтобы индекс NC использовался, чтобы избежать сканирования таблицы.
Если параметры уже имеют тип VARCHAR и выМожно из плана выполнения подтвердить, что используется поиск на ЧПУ, мой первый вопрос был бы о том, что еще делает транзакция, кроме операторов удаления?
Кстати, вы толькодайте название NC-индексу, но я предполагаю, что он (PARTYEXTERNALREF, ISCOUNTERPARTY, PARTYID)
.
Update
Поскольку в вашем комментарии говорится, что столбцы NVARCHARтогда гипотеза сканирования таблиц, вероятно, неверна.Есть еще три возможности вызвать взаимоблокировку, требующую расследования:
- любой другой оператор, выполняемый транзакцией до УДАЛЕНИЯ (это наиболее вероятно)
- любое перекрытие строквыбран двумя операторами DELETE, участвующими в тупике
- коллизия хешей
Только для первых двух гипотез вы можете сделать что-либо прямо сейчас (выясните, верны ли они).Для последнего я могу рассказать вам, как это проверить, но это не тривиально.Это вряд ли случится и немного сложно доказать, но это возможно.Поскольку вы знаете о случае взаимоблокировки (прикрепленный XML), используйте его в качестве базы расследования:
- восстановить копию базы данных на текущий момент времени с остановкой на 2011-09-02T19: 00: 29.690
- запустить
DBCC TRACEON(3604,-1)
- с помощью
DBCC PAGE (<restored db id>, 1, 151867, 3)
проверить значения в слоте 174 - с помощью DBCC PAGE (,1, 140302, 3) `проверить значения в слоте 31
- run
SELECT %%lockres%% FROM PARTIES WHERE PARTYEXTERNALREF = ... AND ISCOUNTERPARTY='N' and PARTYID=...
и передать значения, показанные выше - сравнивает полученные значения хэша блокировки, если они совпадают, то у вас естьстолкновение хешей, и это вызвало тупик.