Поделиться через


Блокировка в компоненте Database Engine

Блокировка — это механизм, с помощью которого компонент MicrosoftSQL Server Database Engine синхронизирует одновременный доступ нескольких пользователей к одному фрагменту данных.

Прежде чем транзакция сможет распоряжаться текущим состоянием фрагмента данных, например для чтения или изменения данных, она должна защититься от изменений этих данных другой транзакцией. Для этого транзакция запрашивает блокировку фрагмента данных. Существует несколько режимов блокировки, например общая или монопольная. Режим блокировки определяет уровень подчинения данных транзакции. Ни одна транзакция не может получить блокировку, которая противоречит другой блокировке этих данных, предоставленной другой транзакции. Если транзакция запрашивает режим блокировки, противоречащий предоставленной ранее блокировке тех же данных, экземпляр компонента Database Engine приостанавливает ее работу до тех пор, пока первая блокировка не освободится.

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

Приложения обычно не запрашивают блокировку напрямую. За управление блокировками отвечает внутренний компонент Database Engine, называемый диспетчером блокировок. Когда экземпляр компонента Database Engine обрабатывает инструкцию Transact-SQL, обработчик запросов компонента Database Engine определяет, к каким ресурсам требуется доступ. Обработчик запросов определяет, какие типы блокировок требуются для защиты каждого ресурса, в зависимости от типа доступа и уровня изоляции транзакции. Затем обработчик запросов запрашивает соответствующую блокировку у диспетчера блокировок. Диспетчер блокировок предоставляет блокировку, если она не противоречит блокировкам, удерживаемым другими транзакциями.

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

Подраздел

Описание

Гранулярность блокировок и иерархии блокировок

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

Режимы блокировки

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

Совместимость блокировок (компонент Database Engine)

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

Блокировка диапазона ключей

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

Укрупнение блокировки (компонент Database Engine)

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

Динамические блокировки

Компонент Database Engine может динамически выбирать уровень гранулярности блокировок, опираясь на сделанную оптимизатором оценку количества строк, на которые ссылается инструкция Transact-SQL.

Отображение сведений о блокировках (компонент Database Engine)

Компонент Database Engine и соответствующий API-интерфейс предоставляют несколько механизмов отображения сведений о блокировках, удерживаемых в экземпляре или базе данных в данный момент.

Взаимоблокировка

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