Блокировка – это отметка (информация) о том, что требуемый ресурс в настоящее время захвачен (в случае блокировок в рассматриваемых информационных системах захвачен транзакцией).
В СУБД на блокировках основана работа механизм обслуживания параллельных запросов.
Возвращаясь к аналогии с поездкой в магазин, можем указать следующие аналоги блокировок:
Еще раз обращаем внимание, что вообще-то блокировка – это не физический захват ресурса, а информация о том, что ресурс захвачен. В широко известной статье про яблоки для подчеркивания этого специально используется внесение записей о захвате ресурсов, потому что иначе, как и в приведенных выше примерах с блокированием ряда стеллажей и протяженного участка дороги, невозможно объяснить и описать захват большего количества ресурсов, чем захватывается физически. Иногда, конечно, можно приводить аналогии и с физическим захватом объектов, понимая под информацией о захвате непосредственное наблюдение факта захвата ресурса. Но вот если мы хотим разобрать работу самого механизма блокировок, физический захват от информации о нем надо отделять.
Следует отметить, что блокировки с точки зрения прикладной логики могут быть необходимыми, а могут быть избыточными. Ограждение ремонта дороги, безусловно, необходимо. Но то же самое ограждение ремонта дороги, занимающее гораздо больше места, чем реально требуется для проведения работ (можно было оградить сначала один ряд, потом второй, а оградили оба на весь период ремонта), или продолжающее стоять после того, как работы закончены, являет собой хорошую иллюстрацию избыточных блокировок.
Далее в этой главе мы рассмотрим то, что называют «блокировками СУБД». Эти блокировки устанавливает менеджер блокировок СУБД, и устанавливает он их только для транзакций. О блокировках, которые устанавливаются платформой «1С:Предприятие» (как объектных, так и транзакционных, устанавливаемых собственным менеджером транзакционных управляемых блокировок), см. главу «Теория», раздел .
Переходя к разбору понятия уровня блокировок, нельзя не отметить путаницу в терминах и попытаться хотя бы слегка с ней разобраться. Разное применение одинаковых терминов приведено в таблице 3.7.1. В данной работе мы будем придерживаться первого столбца, кроме случаев, где об этом будет специально сказано.
Таблица 3.7.1. Разное применение одинаковых терминов, касающихся блокировок
| Термин, применяемый в «1С» сообществе | Термин документации SQL Server | Что это на самом деле | 
|---|---|---|
| Уровень блокировок | Режимы блокировок (Lock modes) | Определяют доступ одновременных транзакций к ресурсам (материал этой главы) | 
| Тип блокировок | ||
| Режим блокировок | ||
| Режим блокировок | Нет | Неаккуратное использование термина «Режим управления блокировкой данных» (автоматический или управляемый) | 
| Гранулярность блокировок | Гранулярность блокировок (Lock granularity), также Уровень блокировок (Lock level) | Объем (уровень в иерархии) ресурсов, на который накладывается блокировка (напр., запись или таблица). При неаккуратном использовании термина «уровень блокировок» может теряться понимание, что на самом деле речь не об уровне блокировки, а об уровне блокируемых ресурсов | 
| Вид блокировок | ||
| Уровень блокировок (напр. в выражении «блокировка на уровне записей») | ||
| Нет | Тип блокировок (Lock type) | Элемент Visual Studio Team Foundation Server 2012 | 
В простейшем случае выделяют два уровня блокировок: исключительный (монопольный) и разделяемый. Исключительный уровень не дает работать с ресурсом никому, кроме захватившей его транзакции, используется для отметки о том, что в ресурс осуществляется запись. Разделяемый уровень позволяет работать с ресурсом другим транзакциям, если они также готовы ограничиться только разделяемым уровнем блокировки. Этот уровень используется для отметки, что осуществляется чтение ресурса.
На практике, однако, этих двух уровней иногда оказывается мало, и для решения некоторых прикладных задач могут быть введены дополнительные уровни.
В таблице 3.7.2 показаны уровни блокировки ресурсов, применяемые компонентом Database Engine SQL Server 2005. В этом случае названия уровней применяются разные, но они являются только синонимами, и при их использовании нет разночтений, поэтому они все приведены вместе.
Таблица 3.7.2. Режимы блокировки ресурсов, применяемые SQL Server 2005
| Режим блокировки | Описание | 
|---|---|
| Shared Разделяемая, совмещаемая блокировка (S) | Используется для операций считывания, которые не меняют и не обновляют данные, такие как инструкция SELECT | 
| Update Блокировка обновления (U) | Применяется к тем ресурсам, которые могут быть обновлены. Предотвращает возникновение распространенной формы взаимоблокировки, возникающей тогда, когда несколько сеансов считывают, блокируют и затем, возможно, обновляют ресурс | 
| Exclusive Эксклюзивная, исключительная, монопольная блокировка (Х) | Используется для операций модификации данных, таких как инструкции INSERT, UPDATE или DELETE. Гарантирует, что несколько обновлений не будет выполнено одновременно для одного ресурса | 
| Intent Блокировка с намерением (IS, IX, SIX) | Используется для создания иерархии блокировок. Типы намеренной блокировки: с намерением совмещаемого доступа (IS), с намерением монопольного доступа (IX), а также совмещаемая с намерением монопольного доступа (SIX). Блокировки с намерением называются так потому, что их получают до блокировок ресурсов более низкого уровня, то есть они обозначают намерение поместить блокировку на более низком уровне ресурсов. Имеют особенность: устанавливаются на верхних уровнях иерархии (например, на уровне таблицы). Таким образом, если в графе взаимоблокировки встретилась блокировка с намерением, можно сразу говорить о том, что ею заблокирован большой объем данных, совершенно точно это не единичные записи  |       
| Schema Блокировка схемы (Sch-S, Sch-M) | Используется во время выполнения операции, зависящей от схемы таблицы. Типы блокировки схем: блокировка изменения схемы (Sch-S) и блокировка стабильности схемы (Sch-M) | 
| Bulk Update Блокировка массового обновления (BU) | Используется, если выполняется массовое копирование данных в таблицу и указана подсказка TABLOCK | 
| Key-range Диапазон ключей  |           Защищает диапазон строк, считываемый запросом при использовании уровня изоляции транзакции Serializable. Запрещает другим транзакциям вставлять строки, что помогает запросам такой транзакции уточнять, были ли запросы запущены повторно | 
На два режима блокировок SQL Server хотелось бы обратить особое внимание:
Способность нескольких транзакций одновременно обзавестись блокировками на один и тот же ресурс определяется совместимостью блокировок. Если на ресурсе уже стоит блокировка от другой транзакции, новое требование на блокировку, полученное от другой транзакции, может быть удовлетворено, только если затребованный уровень блокировки совместим с уже установленным уровнем. В противном случае транзакция, запросившая новую блокировку, будет ждать, пока не истечет время ожидания существующей блокировки.
В таблице 3.7.3 показана совместимость для наиболее распространенных уровней блокировки.
Таблица 3.7.3. Совместимость наиболее распространенных уровней блокировки SQL Server
| Запрашиваемый уровень | Уже предоставленный уровень | ||
|---|---|---|---|
| S | U | X | |
| Разделяемая (S) | Да | Да | Нет | 
| Обновления (U) | Да | Нет | Нет | 
| Исключительная (Х) | Нет | Нет | Нет |