Deadlocks - блокировка и ожидание одного и того же индекса
У меня возникла тупиковая ситуация в приложении SQL Server. Я запустил SQL Profiler и поднял "граф взаимоблокировок", и это, кажется, говорит мне, что оба процесса удерживают и ожидают блокировки для одного и того же индекса первичного ключа.
Причиной тупика является обновление таблицы, запущено несколько потоков, и оба процесса выполняют одну и ту же хранимую процедуру обновления (хотя и с разными параметрами). Это нормально, поскольку хранимый процесс только увеличивает счетчики, поэтому предыдущее состояние данных не имеет значения.
то есть ОБНОВЛЕНИЕ xxx SET yyy = yyy + zzz ГДЕ aaa = @aaa
- Почему оба процесса запрашивают блокировку U, когда они оба уже удерживают блокировку X, наверняка они могут выполнить обновление с блокировкой X?
- Как оба процесса получили X-блокировку одновременно?
- Как мне исправить это?:-)
Спасибо за помощь.
редактировать: дополнительная информация
Точная процедура:
CREATE PROC spuPlayerStats
@PlayerId int,
@HandsPlayed int
AS
BEGIN
UPDATE Player
SET
HandsPlayed = HandsPlayed + @HandsPlayed
WHERE
PlayerId = @PlayerId
END
GO
Индекс - это просто первичный кластерный индекс.
2 ответа
ПЫТАТЬСЯ:
SELECT @updateValue = HandsPlayed + @HandsPLayed FROM Player WHERE PlayerId = @PlayerId
UPDATE Player
SET
HandsPlayed = updateValue
WHERE
PlayerId = @PlayerId
Я рекомендую вам опубликовать фактический тупик XML. Графическое представление не всегда точное, см . Загадку U-блокировок в графе тупиков s. Блокировки могут возникать даже при обманчиво простых утверждениях в хорошо настроенных запросах, в зависимости от порядка применения обновлений, см. " Блокировка чтения / записи". Кроме того, могут возникать взаимоблокировки даже в системах, которые, по-видимому, на 100% безопасны, как та, которую вы первоначально описали в посте (обновление одной строки в кластеризованном индексе без обновлений вторичного индекса для разных ключей) из-за коллизий хешей, см. %%lockres%% вероятность столкновения магический маркер: 16,777,215.
Теперь я не ожидаю, что ваше дело будет эзотерическим, в вашей ситуации это просто отсутствие информации о том, что на самом деле происходит. Пожалуйста, опубликуйте точное определение схемы ваших данных (все таблицы, все индексы), точные операции, которые происходят в каждой задействованной транзакции, и фактический тупиковый XML, а не графическое отображение.