Блокировки в СУБД

Блокировка – это информация о том, что тот или иной ресурс занят конкретной транзакцией. Если уровень изоляции – это степень защиты, то блокировки – это инструмент СУБД для реализации защиты данных.

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

Типы блокировок

Типов блокировок СУБД очень много, но нас интересуют только 3:

Курс 1С: Эксперт. Таблица блокировок СУБД
Типы блокировок в СУБД

S – блокировка (Shared)

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

Для одного ресурса может быть установлено несколько S-блокировок, поэтому она и называется Разделяемая.

X – блокировка (Exclusive).

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

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

U – блокировка (Update).

Обновление — это разделяемая с целью в дальнейшем изменить данные, т.е. перейти в Исключтельную. Отличительная особенность U от X – это то, что пока стоит U, другие транзакции могут читать данные, но не могут установить свою U или X блокировку.

Для одного ресурса (строк или таблиц) невозможно установить более одной U. Только 1 транзакция может захватить ресурс и установить U, потому что она имеет цель перейти в Исключительную.

Курс 1С: Эксперт. Блокировки СУБД и уровни изоляции транзакций
Блокировки СУБД и уровни изоляции транзакций

Механизм блокировок СУБД

Механизм блокировок СУБД реализован через отдельные таблицы, где хранится информация о заблокированных ресурсах: какие ресурсы заблокированы, кем и с каким типом блокировки. Отдельное задание постоянно пробегается по таблице и выполняет проверку, не освободились ли данные ресурсы: зафиксировалась или отменилась ли транзакция, которая их блокировала.  Если транзакция уже не активна, то информация удаляется.

Просмотреть текущие блокировки в MS SQL можно в таблице sys.dm_tran_locks.

SELECT * FROM (
  SELECT 
    CASE resource_type
    	WHEN N'OBJECT' THEN OBJECT_NAME(resource_associated_entity_id)
    	WHEN N'KEY'THEN (SELECT OBJECT_NAME(object_id) FROM sys.partitions WHERE hobt_id = resource_associated_entity_id)
    	WHEN N'PAGE' THEN (SELECT OBJECT_NAME(object_id) FROM sys.partitions WHERE hobt_id = resource_associated_entity_id)
    	WHEN N'HOBT' THEN (SELECT OBJECT_NAME(object_id) FROM sys.partitions WHERE hobt_id = resource_associated_entity_id)
    	WHEN N'RID' THEN (SELECT OBJECT_NAME(object_id) FROM sys.partitions WHERE hobt_id = resource_associated_entity_id)
    	ELSE N'Unknown'
    END AS objectName,
    CASE resource_type
    	WHEN N'KEY' THEN (SELECT indexes.name 
                FROM sys.partitions JOIN sys.indexes 
                	ON partitions.object_id = indexes.object_id AND partitions.index_id = indexes.index_id
                WHERE partitions.hobt_id = resource_associated_entity_id)
    	ELSE N'Unknown'
    END AS IndexName,
    resource_type,
    DB_NAME(resource_database_id) AS database_name,
    resource_description,
    resource_associated_entity_id,
    request_mode,
    request_session_id
	FROM sys.dm_tran_locks AS dm_tran_locks
    WHERE resource_database_id = DB_ID(N'ИМЯ_БД')) t_Result
WHERE NOT objectName = N'Unknown' AND request_mode = N'X'

Данная тема подробнее рассматривается в пакете видео-курса «Секреты 1С: Эксперта» Шаг 3. Занятие 09-01 Знакомство с блокировками.

Константин Ефимов | 1С: Эксперт. Фриланс, Вьетнам.

КОНСТАНТИН ЕФИМОВ
Комментарии и вопросы