SQL Server может сначала установить мелкие блокировки (например, строки или страницы) и затем в определенных обстоятельствах попытаться расширить мелкие блокировки до крупных (например, таблицы).
В следующей таблице показаны режимы блокировки ресурсов, применяемые компонентом Database Engine.
Режим блокировки
| Описание
| Совмещаемая блокировка (S)
| Используется для операций считывания, которые не меняют и не обновляют данные (инструкция SELECT).
| Блокировка обновления (U)
| Применяется к тем ресурсам, которые могут быть обновлены. Предотвращает возникновение распространенной формы взаимоблокировки, возникающей тогда, когда несколько сеансов считывают, блокируют и затем, возможно, обновляют ресурс.
| Монопольная блокировка (Х)
| Используется для операций модификации данных, таких как инструкции INSERT, UPDATE или DELETE. Гарантирует, что несколько обновлений не будет выполнено одновременно для одного ресурса.
| Блокировка с намерением
| Используется для создания иерархии блокировок. Типы намеренной блокировки: с намерением совмещаемого доступа (IS), с намерением монопольного доступа (IX), а также совмещаемая с намерением монопольного доступа (SIX).
| Блокировка схемы
| Используется во время выполнения операции, зависящей от схемы таблицы. Типы блокировки схем: блокировка изменения схемы (Sch-S) и блокировка стабильности схемы (Sch-M).
| Блокировка массового обновления (BU)
| Используется, если выполняется массовое копирование данных в таблицу и указана подсказка TABLOCK.
| Диапазон ключей
| Защищает диапазон строк, считываемый запросом при использовании уровня изоляции сериализуемой транзакции. Запрещает другим транзакциям вставлять строки, что помогает запросам сериализуемой транзакции уточнять, были ли запросы запущены повторно.
|
Блокировки с намерением
В компоненте Database Engine блокировки с намерением применяются для защиты размещения совмещаемой (S) или монопольной (X) блокировки ресурса на более низком уровне иерархии. Блокировки с намерением называются так потому, что их получают до блокировок более низкого уровня, то есть они обозначают намерение поместить блокировку на более низком уровне.
Блокировка с намерением выполняет две функции:
· предотвращает изменение ресурса более высокого уровня другими транзакциям таким образом, что это сделает недействительной блокировку более низкого уровня;
· повышает эффективность компонента Database Engine при распознавании конфликтов блокировок на более высоком уровне гранулярности.
Например, в таблице требуется блокировка с намерением совмещаемого доступа до того, как для страниц или строк этой таблицы будет запрошена совмещаемая (S) блокировка.
Если задать блокировку с намерением на уровне страницы, то другим транзакциям будет запрещено получать монопольную (X) блокировку для таблицы, содержащей эту страницу.
Блокировка с намерением повышает производительность, поскольку компонент Database Engine проверяет наличие таких блокировок только на уровне таблицы, чтобы определить, может ли транзакция безопасно получить для этой таблицы совмещаемую блокировку. Благодаря этому нет необходимости проверять блокировки в каждой строке и на каждой странице, чтобы убедиться, что транзакция может заблокировать всю таблицу.
В состав блокировок с намерением входят блокировка с намерением совмещаемого доступа (IS), блокировка с намерением монопольного доступа (IX), а также совмещаемая блокировка с намерением монопольного доступа (SIX).
Следующие три типа замков используются для блокирования на уровне строк и на уровне страниц:
1. разделяемый (shared, S);
2. исключительный (exclusive, X)
3. обновление (update, U).
Разделяемая блокировка (shared, S)резервирует ресурс (страницу или строку) только для чтения. Другие процессы не могут изменять заблокированный ресурс, пока блокировка не будет снята. С другой стороны, отдельные процессы могут устанавливать разделяемую блокировку для этого ресурса в то же самое время, т. е. другие процессы могут читать ресурс, заблокированный при помощи разделяемой блокировки.
Исключительная блокировка (exclusive, X);резервирует страницу или строку для исключительного использования в одной транзакции. Она используется для операторов DML (INSERT, Update или DELETE), которые изменяют ресурс.
Исключительная блокировка не может быть установлена, если некоторый другой процесс сохраняет разделяемую или исключительную блокировку на этот ресурс, т. е. для ресурса может существовать только одна исключительная блокировка. Как только на страницу (или строку) устанавливается исключительная блокировка, никакая другая блокировка не может быть установлена на тот же самый ресурс.
Блокировка на уровне страницы также допускает целевую блокировку (см. далее).
Блокировка обновления (update, U) может быть установлена, только если не существует другой блокировки обновления или исключительной блокировки. При этом она может быть установлена на объекты, которые уже имеют разделяемую блокировку.
В этом случае блокировка обновления получает и другую разделяемую блокировку на тот же объект. Если транзакция, которая изменяет объект, подтверждается, блокировка обновления заменяется на исключительную блокировку, если для объекта не существует других блокировок.
Блокировка обновления предотвращает некоторые общие типы взаимных блокировок (см. далее).
В таблице показана матрица совместимости разделяемых, исключительных блокировок и блокировок обновления(на уровне строк и на уровне страниц).
| Разделяемая блокировка
| Блокировка обновления
| Исключительная блокировка
| Разделяемая блокировка
| Да
| Да
| Нет
| Блокировка обновления
| Да
| Нет
| Нет
| Исключительная блокировка
| Нет
| Нет
| Нет
|
Эта матрица интерпретируется следующим образом: предположим, транзакция Т1имеет блокировку, как показано в первом столбце матрицы; предположим также, что некоторая другая транзакция Т2запрашивает блокировку, как задано в соответствующем заголовке столбца. В этом случае "Да" означает, что блокировка для Т2возможна, в то время как "Нет" указывает на конфликт с существующей блокировкой.
На уровне таблицы существуют пять различных типов блокировок:
1. разделяемая (shared, S)
2. исключительная (exclusive, X);
3. разделяемая блокировка с намерением (intent shared, IS);
4. исключительная блокировка с намерением (intent exclusive, IX);
5. разделяемая блокировка с намерением исключительного доступа (shared with intent exclusive, SIX).
Разделяемые и исключительные блокировки соответствуют блокировкам на уровне строки (или страницы) с тем же именем.
Как правило, блокировка с намерениемпоказывает намерение установить блокировку на ресурс низкого уровня в иерархии объектов базы данных.
Поэтому блокировки с намерением помещаются в иерархии объектов на один уровень выше того объекта, который этот процесс намеревается заблокировать. Это эффективный способ выяснить, возможна ли подобная блокировка, здесь также устанавливается запрет другим процессам блокировать более высокий уровень до того, как нужная блокировка будет достигнута.
|