Тема тупиковой ситуации на сервере sql обсуждалась много раз, однако я не был уверен, что даже две одновременные вставки в таблицу могут привести к тупиковой ситуации.
Сценарий: при тестировании нашего приложения (SQLServer 2005 в качестве бэкэнда, ASP.net 3.5) мы вставляли записи в таблицу одновременно (упрощенный обзор), что привело к тупику для более чем 70% пользователей.Я не мог понять, как вставка находится в тупике, так как это не относится к нескольким ресурсам.После детального анализа (воспроизведения ошибки двумя пользователями) я обнаружил, что оба процесса держали блокировку RangeS-S в индексе первичного ключа таблицы и пытались преобразовать ее в блокировку RangeI-N, что привело квзаимоблокировка и уничтожение одной транзакции.
Вопрос. Можем ли мы избежать или уменьшить количество таких взаимоблокировок, поскольку это не случай изменения порядка доступа к ресурсам?Не можем ли мы заставить транзакцию изначально получить эксклюзивную блокировку, чтобы она блокировала другой процесс и избежала тупика?Какие (неблагоприятные) последствия могут иметь?Также может кто-нибудь объяснить больше о блокировке RangeI-N.
Уровень изоляции для этого был «Сериализуемым».
Любое предложение будет полезным.
Спасибо, Гаурав