Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 34

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

Следующие характеристики могут быть назначены блокировке уровня таблицы:

*  Вы можете указать одно или более опций блокировки на таблицу

*  Используйте optimizer_hints из секции FROM оператора SELECT или UPDATE.

*  Эти опции перезаписывают соответствующие опции, которые были указаны до этого с помощью оператора SET.

Следующая таблица описывает опции блокировок уровня таблицы:

Опция

Описание

HOLDLOCK

SERIALIZE

REPEATABLEREAD

READCOMMITED

READUNCOMMITED

NOLOCK

Контролирует поведение блокировки для таблицы.

ROWLOCK

PAGLOCK

TABLOCK

TABLOCKX

Указывает размер и тип блокировки, которая будет использоваться для таблицы.

READPAST

Пропустить заблокированные строки.

UPDLOCK

Использовать блокировки обновления взамен разделяемых блокировок.

Мёртвые блокировки

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

Сервер SQL завершает мёртвые блокировки с помощью автоматического прерывания одной из транзакций. Процесс SQL сервера использует следующий список:

*  Откатывает транзакцию являющуюся жертвой мёртвой блокировки

*  Сообщает приложению жертве мёртвой блокировки (с сообщением 1205)

*  Отменяет текущий запрос жертвы мёртвой блокировки

*  Позволяет другим транзакциям продолжать работу.

В многопользовательской системе, каждый клиент должен регулярно проверять сообщение 1205, которое указывает на откат транзакции. Если найдено это сообщение, приложение должно повторить попытку снова.

Хотя это не всегда возможно, вы должны минимизировать риск возникновения мёртвых блокировок с помощью следования рекомендациям:

*  Используйте ресурсы в определённой последовательности во всех транзакциях

*  Сокращайте транзакции с помощью минимизации шагов

*  Сокращайте время транзакции с помощью предотвращения использования запросов возвращающих большое количество строк.

Если транзакция заблокировала в ожидании ресурса и появилась мёртвая блокировка, сервер прервёт одну из транзакций без времени ожидания.

Установка LOCK_TIMEOUT позволяет приложениям установить максимальное количество времени, которое оператор ждёт заблокированный ресурс, прежде чем заблокированный оператор автоматически отменится. Отмена не откатывает транзакцию и не отменяет её. Приложение должно ловить сообщение и выполнять восстановительные действия, такие как повторная отправка транзакции или отмена.

Команда KILL прерывает процесс пользователя основанный на ID процесса (spid).

Отображение заблокированной информации

Вы можете использовать Enterprise Manager или процедуру sp_lock для отображения отчёта об активных блокировках. Вы можете использовать SQL Profiler для получения информации на указанный набор транзакций. Вы также можете использовать системный монитор для просмотра истории блокировок.

15.5 Рекомендуемая практика

Вы должны рассматривать следующие практические рекомендации, когда управляете транзакциями и блокировками:

*  Делайте транзакции максимально короткими, что уменьшит возможность конфликтов блокировок с другими транзакциями.

*  Разрабатывайте транзакции для минимизации мёртвых блокировок так, чтобы они никогда не переотправлялись.

*  Используйте блокировки SQL Server по умолчанию, потому что оптимизатор выбирает наилучший способ блокировка.

*  Будьте осторожны, когда используете опции блокировки и тестируйте ваши транзакции, чтобы гарантировать, что ваша блокировка выбрала лучший способ, чем SQL Server.