22. Режимы блокировок и совместимость блокировок - KattyOG/Database GitHub Wiki
SQL Server блокирует ресурсы с помощью различных режимов блокировки, которые определяют доступ одновременных транзакций к ресурсам. В следующей таблице показаны режимы блокировки ресурсов, применяемые компонентом Database Engine.
Совмещаемые блокировки. Совмещаемые (S) блокировки позволяют одновременным транзакциям считывать (SELECT)
ресурс под контролем пессимистичного параллелизма. Пока для ресурса существуют совмещаемые (S) блокировки,
другие транзакции не могут изменять данные. Совмещаемые блокировки (S) ресурса снимаются по завершении операции
считывания, если только уровень изоляции транзакции не установлен на повторяющееся чтение или более высокий
уровень, а также если совмещаемые блокировки (S) не продлены на все время транзакции с помощью указания
блокировки.
Блокировки обновления. Блокировки обновления (U) предотвращают возникновение распространенной формы
взаимоблокировки. В сериализуемой транзакции или транзакции операцией чтения с возможностью повторения
транзакция считывает данные, запрашивает совмещаемую (S) блокировку на ресурс (страницу или строку), затем
выполняет изменение данных, что требует преобразование блокировки в монопольную (X). Если две транзакции
запрашивают совмещаемую блокировку на ресурс и затем пытаются одновременно обновить данные, то одна из
транзакций пытается преобразовать блокировку в монопольную (X). Преобразование совмещаемой блокировки в
монопольную потребует некоторого времени, поскольку монопольная блокировка для одной транзакции несовместима с
совмещаемой блокировкой для другой транзакции. Начнется ожидание блокировки. Вторая транзакция попытается
получить монопольную (X) блокировку для обновления. Поскольку обе транзакции выполняют преобразование в
монопольную (X) блокировку и при этом каждая из транзакций ожидает, пока вторая снимет совмещаемую блокировку, то в результате возникает взаимоблокировка. Чтобы избежать этой потенциальной взаимоблокировки, применяются блокировки обновления (U). Блокировку
обновления (U) может устанавливать для ресурса одновременно только одна транзакция. Если транзакция изменяет ресурс, то блокировка обновления (U) преобразуется в монопольную (X) блокировку.
Монопольные блокировки - Монопольная (X) блокировка запрещает транзакциям одновременный доступ к ресурсу.
Если ресурс удерживается монопольной (X) блокировкой, то другие транзакции не могут изменять данные. Операции
считывания будут допускаться только при наличии указания NOLOCK или уровня изоляци и незафиксированной
операции чтения. Изменяющие данные инструкции, такие как INSERT, UPDATE или DELETE, соединяют как операции
изменения, так и операции считывания. Чтобы выполнить необходимые операции изменения данных, инструкция сначала
получает данные с помощью операций считывания. Поэтому, как правило, инструкции изменения данных запрашивают
как совмещаемые, так и монопольные блокировки. Например, инструкция UPDATE может изменять строки в одной
таблице, основанной на соединении данных из другой таблицы. В этом случае инструкция UPDATE кроме монопольной
блокировки обновляемых строк запрашивает также совмещаемые блокировки для строк, считываемых в соединенной
таблице.
Блокировки с намерением - В компоненте Компонент Database Engine блокировки с намерением применяются для
защиты размещения совмещаемой (S) или монопольной (X) блокировки ресурса на более низком уровне иерархии.
Блокировки с намерением называются так потому, что их получают до блокировок более низкого уровня, то есть они
обозначают намерение поместить блокировку на более низком уровне.
Блокировка с намерением выполняет две функции:
- предотвращает изменение ресурса более высокого уровня другими транзакциям таким образом, что это сделает недействительной блокировку более низкого уровня;
- повышает эффективность компонента Компонент Database Engine при распознавании конфликтов блокировок на более высоком уровне гранулярности.
Блокировки схем - В компоненте Компонент Database Engine блокировка изменения схемы (Sch-M) применяется с операциями языка DDL для таблиц, например при добавлении столбца или очистке таблицы. Пока удерживается блокировка изменения схемы (Sch-M), одновременный доступ к таблице запрещен. Это означает, что любые операции вне блокировки изменения схемы (Sch-M) будут запрещены до снятия блокировки.
- Блокировка изменения схемы (Sch M) применяется с некоторыми операциями языка обработки данных, например усечением таблиц, чтобы предотвратить одновременный доступ к таблице.
- Блокировка стабильности схемы (Sch S) применяется компонентом Компонент Database Engine при компиляции и выполнении запросов. Блокировка стабильности схемы (Sch S) не влияет на блокировки транзакций, включая монопольные (X) блокировки. Поэтому другие транзакции (даже транзакции с монопольной блокировкой (X) для таблицы) могут продолжать работу во время компиляции запроса. Однако одновременные операции DDL и DML, которые запрашивают блокировки изменения схемы (Sch M), не могут выполняться над таблицей.
Блокировки массового обновления - Блокировка массового обновления (BU) позволяет поддерживать несколько
одновременных потоков массовой загрузки данных в одну и ту же таблицу и при этом запрещать доступ к таблице любым
другим процессам, отличным от массовой загрузки данных. Компонент Database Engine использует блокировки массового
обновления (BU), если выполняются два следующих условия. Используется инструкция Transact SQL BULK INSERT,
функция OPENROWSET(BULK) или одна из таких команд массовой вставки API, как .NET SqlBulkCopy, OLEDB Fast
Load APIs или ODBC Bulk Copy APIs, для массового копирования данных в таблицу. Выделено указание TABLOCK или
установлен параметр таблицы table lock on bulk load с помощью хранимой процедуры sp_tableoption.
Блокировки диапазона ключа. - Блокировки диапазона ключей защищают диапазон строк, неявно включенный в набор
записей, считываемый инструкцией Transact SQL при использовании уровня изоляции сериализуемых транзакций.
Блокировка диапазона клю чей предотвращает фантомные чтения. Кроме того, защита диапазона ключей между строк
предотвращает фантомную вставку или удаление из набора записи, к которому получает доступ транзакция.
Совместимость блокировок определяет, могут ли несколько транзакций одновременно получить блокировку одного и того же ресурса. Если ресурс уже блокирован другой транзакцией, новая блокировка может быть предоставлена только в том случае, если режим запрошенной блокировки совместим с режимом существующей. В противном случае транзакция, запросившая новую блокировку, ожидает освобождения ресурса, пока не истечет время ожидания существующей блокировки. Например с монопольными блокировками не совместим ни один из режимов блокировки. Пока удерживается монопольная ( X ) блокировка, больше ни одна из транзакций не может получить блокировку ни одного из типов (разделяемую, обновления или монопольную) на этот ресурс, пока не будет освобождена монопольная X ) блокировка. И наоборот, если к ресурсу применяется раз деляемая ( S ) блокировка, другие транзакции могут получать разделяемую блокировку или блокировку обновления ( U ) на этот элемент, даже если не завершилась первая транзакция. Тем не менее, другие транзакции не могут получить монопольную блокировку до освобожд ения разделяемой.