Как SQL Server определяет порядок блокировки при выборе таблицы?


10

У меня есть две хранимые процедуры, которые блокируются, когда система находится под нагрузкой. Proc A выбирает из таблицы, в то время как Proc B вставляет в ту же таблицу. График блокировки показывает, что Proc A имеет блокировку страницы в режиме S, для которой Proc B хочет блокировку режима IX, Proc A ожидает блокировки страницы в режиме S для другой страницы, для которой Proc B уже имеет блокировку страницы в режиме IX ,

Ясно, что это можно решить, убедившись, что оба запроса блокируют страницы в таблице в одном и том же порядке, но я не могу понять, как это сделать.

Мой вопрос: как SQL Server определяет, в каком порядке блокировать страницы при выполнении операций INSERT и SELECT, и как вы можете изменить это поведение?

Ответы:


2

Как SQL Server определяет порядок блокировки страниц при выполнении INSERT и SELECT

Не определено - выполняется внутренней обработкой и зависит от вывода оптимизатора запросов.

и как вы можете изменить это поведение?

Контролируйте свою изоляцию. Если вы читаете, чтобы написать, скажите SQL Server немедленно получить блокировку записи. Точка закрыта.


1

В настоящее время proc A имеет общую блокировку.

«Никакие другие транзакции не могут изменять данные, пока на ресурсе существуют общие (S) блокировки». http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Если вы находитесь на SQL 2005 или выше, попробуйте использовать изоляцию снимка.

«Уровень изоляции моментального снимка использует управление версиями строк для обеспечения согласованности чтения на уровне транзакций. Операции чтения не получают блокировок страниц или строк; приобретаются только блокировки таблиц SCH-S. При чтении строк, измененных другой транзакцией, они получают версию строки, которая существовал при запуске транзакции. Вы можете использовать изоляцию моментального снимка для базы данных, только если для параметра базы данных ALLOW_SNAPSHOT_ISOLATION установлено значение ON. По умолчанию этот параметр отключен для пользовательских баз данных. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Поскольку получаются только блокировки Sch-S, ваше чтение не должно блокировать вашу запись.

«Блокировки стабильности схемы (Sch-S) не блокируют никакие транзакционные блокировки, включая эксклюзивные (X) блокировки». http://msdn.microsoft.com/en-us/library/ms189122.aspx

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.