Проблемы
Рассмотрим следующий сценарий.
-
У вас есть база данных Microsoft SQL Server 2012 с включенными параметрами ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT .
-
У вас есть по крайней мере три параллельных запроса, которые выполняются в одной и той же таблице.
-
В запросах используется подсказка запроса (TABLOCK, UPDLOCK) .
-
Каждый запрос обернут в явный оператор BEGIN TRAN , но инструкция commit Tran не выполняется.
При фиксации первого запроса в этом сценарии один из других запросов будет заблокирован. При включении READ_COMMITTED_SNAPSHOT вместе с подсказками подсказок TABLOCK и UPDLOCK сеансы принимают на таблице блокировку IX. Взаимоблокировка происходит, когда два одновременных сеанса пытаются одновременно преобразовать блокировки IX в блокировки X. Если READ_COMMITTED_SNAPSHOT отключена, сеансы будут получать шесть блокировок, которые не будут блокироваться, когда они преобразуются в блокировки X. Исправление устраняет это поведение, предоставляя LCK_M_SCH_S блокировки вместо IX locks при использовании READ_COMMITTED_SNAPSHOT с подсказками TABLOCK и UPDLOCK .Примечание.Эта проблема также возникает в Microsoft SQL Server 2008 R2. Исправление для SQL Server 2008 R2 будет выпущено в ближайшее время.
Решение
Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.
Накопительное обновление 8 для SQL Server 2012 с пакетом обновления 1 (SP1) /en-us/help/2917531
Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".