У меня возникла тупиковая ситуация в приложении SQL Server.Я запустил SQL Profiler и поднял «граф взаимоблокировок», и это, кажется, говорит мне, что оба процесса удерживают и ожидают блокировки для одного и того же индекса первичного ключа.
Вызывается взаимоблокировкапри обновлении таблицы выполняется несколько потоков, и оба процесса выполняют одну и ту же хранимую процедуру обновления (хотя и с разными параметрами).Это нормально, поскольку хранимый процесс только увеличивает счетчики, поэтому предыдущее состояние данных не имеет значения.
т.е. ОБНОВЛЕНИЕ xxx SET yyy = yyy + zzz ГДЕ aaa = @ aaa
- Почемуоба процесса запрашивают блокировку U, когда они оба уже удерживают блокировку X, наверняка они могут выполнить обновление с блокировкой X?
- Как оба процесса получили блокировку X одновременно?
- Как мне исправить это?:-)
Спасибо за помощь.
![enter image description here](https://i.stack.imgur.com/cranV.jpg)
edit: Дополнительная информация
Точная процедура:
CREATE PROC spuPlayerStats
@PlayerId int,
@HandsPlayed int
AS
BEGIN
UPDATE Player
SET
HandsPlayed = HandsPlayed + @HandsPlayed
WHERE
PlayerId = @PlayerId
END
GO
Индекс - это просто первичный кластерный индекс.