Проблемы
Рассмотрим следующий сценарий.
-
У вас есть база данных с параметрами ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT , включенными в Microsoft SQL Server 2008 R2.
-
Вы запускаете инструкцию SELECT , содержащую подсказки TABLOCK и UPDLOCK , для таблицы в базе данных.
-
Инструкция SELECT переносится в явном виде BEGIN TRAN, но commit Tran не выполняется.
-
Два других запроса, запущенных с одинаковыми подсказками, находятся в явной транзакции.
В этом случае при фиксации первого запроса один из других запросов будет заблокирован.
Причина
Проблема возникает из-за того, что SQL Server неправильно сообщает о взаимоблокировке в одном из следующих сценариев:
-
Если для базы данных включены ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT , несколько запросов к одной и той же транзакции могут быть ошибочно заблокированы при завершении одной из них.
-
Если ALLOW_SNAPSHOT_ISOTION включена и используются подсказки TABLOCK и UPDLOCK , вторая и третья инструкции SELECT принимают блокировки IX с намерением для преобразования в X. Блокировка IX завершает взаимоблокировку при попытке преобразовать в X.
-
Если ALLOW_SNAPSHOT_ISOLATION отключена, второй и третий запросы будут получать шесть блокировок. В этой ситуации, когда шесть блокировок преобразуются в X, это просто блокирующий сценарий, а не как взаимоблокировка.
Решение
Эта проблема впервые устранена в следующем накопительном обновлении SQL Server. После применения исправления SQL Server устранит проблему, записав в том случае, если для базы данных и запроса обнаружена подсказка Read Commit или NOLOCK . Эти сведения используются для правильного выбора типа блокировки для правильной обработки ситуации вместо неправильной передачи данных.
Накопительное обновление 11 для SQL Server 2008 R2 с пакетом обновления 2 (SP2) /en-us/help/2926028
Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".