SQL Server тупик при вставке строк в таблицу - PullRequest
1 голос
/ 15 октября 2010

Тема тупиковой ситуации на сервере sql обсуждалась много раз, однако я не был уверен, что даже две одновременные вставки в таблицу могут привести к тупиковой ситуации.

Сценарий: при тестировании нашего приложения (SQLServer 2005 в качестве бэкэнда, ASP.net 3.5) мы вставляли записи в таблицу одновременно (упрощенный обзор), что привело к тупику для более чем 70% пользователей.Я не мог понять, как вставка находится в тупике, так как это не относится к нескольким ресурсам.После детального анализа (воспроизведения ошибки двумя пользователями) я обнаружил, что оба процесса держали блокировку RangeS-S в индексе первичного ключа таблицы и пытались преобразовать ее в блокировку RangeI-N, что привело квзаимоблокировка и уничтожение одной транзакции.

Вопрос. Можем ли мы избежать или уменьшить количество таких взаимоблокировок, поскольку это не случай изменения порядка доступа к ресурсам?Не можем ли мы заставить транзакцию изначально получить эксклюзивную блокировку, чтобы она блокировала другой процесс и избежала тупика?Какие (неблагоприятные) последствия могут иметь?Также может кто-нибудь объяснить больше о блокировке RangeI-N.

Уровень изоляции для этого был «Сериализуемым».

Любое предложение будет полезным.

Спасибо, Гаурав

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

Изменить уровень изоляции ADO. Если у вас нет четких требований к Serializable, вы не должны его использовать. Если вы используете его, то вы должны четко понимать последствия, и частые тупики из-за блокировок диапазона являются одним из этих последствий.

Уровень изоляции System.Transactions контролируется свойством IsolationLevel.

1 голос
/ 15 октября 2010

Используйте sp_getapplock для получения пользовательской эксклюзивной блокировки

...