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

Schema lock гарантирует, что таблица или индекс не будут удалены или схема не будет изменена.

15.4 Управление блокировками

Блокировки уровня сессии

Сервер SQL позволяет вам контролировать опции блокировки на уровне сессии с помощью установки изолированного уровня транзакций.

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

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

Вы можете аннулировать изолированный уровень уровня сессии в индивидуальном операторе с помощью использования спецификации блокировок. Вы можете также использовать оператор DBCC USEROPTIONS для указания изоляции транзакции для оператора.

SET TRANSACTION ISOLATION LEVEL  { READ COMMITTED  | READ UNCOMMITTED  | REPEATABLE READ  | SERIALIZABLE  }

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

Опция

Описание

READ COMMITED

Указывает на использование разделяемых блокировок для чтения. На этом уровне вы не можете использовать грязное чтение

REPEATABLE READ

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

SERIALIZABLE

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

Следующий пример устанавливает изолированный уровень для текущей сессии для READ UNCOMMITTED и после этого проверяет DBCC USEROPTIONS для проверки что SQL Server сделал изменения.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

DBCC USEROPTIONS

Результат:

Set Option            Value                                          

---------------------- ---------------------

textsize              64512

language              us_english

dateformat            mdy

datefirst             7

quoted_identifier     SET

arithabort            SET

....

isolation level       read uncommitted

(13 row(s) affected)

С помощью опции SET LOCK_TIMEOUT можно установить максимальное количество времени, которое SQL Server позволяет транзакции ожидать освобождения заблокированных ресурсов.

SET LOCK_TIMEOUT период

Период указывает количество миллисекунд. Если указать -1 (значение по умолчанию), то ожидание бесконечно. После изменения этого значение, оно сохраняется до конца сессии.

SET LOCK_TIMEOUT 180000

Для определение значения текущей сессии запросите глобальную переменную @@lock_timeout.

SELECT @@lock_timeout

Архитектура динамических блокировок

Сервер SQL использует динамическую архитектуру блокировок для определения наиболее эффективной блокировки. Он автоматически определяет, какая блокировка наиболее подходит во время выполнения запроса, основываясь на характеристики схемы и запроса.

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

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

Опции блокировки уровня таблицы

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