Открыть сервис

Блокировка записи

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

Назначение и принцип работы

Основная цель блокировки записи — обеспечение целостности данных (свойство ACID — изоляция транзакций) в условиях конкурентного доступа. Без блокировок два параллельных процесса могли бы одновременно изменить одну и ту же запись, что привело бы к потере одного из изменений или к некорректному состоянию данных.

Принцип работы блокировки записи заключается в следующем:

  1. Процесс, желающий изменить данные, запрашивает блокировку записи у СУБД.
  2. Если блокировка записи на данный ресурс не установлена другим процессом, СУБД предоставляет её, и процесс получает исключительное право на изменение.
  3. Другие процессы, пытающиеся установить блокировку записи на тот же ресурс, ставятся в очередь ожидания до освобождения блокировки.
  4. После завершения операции записи процесс снимает блокировку, и следующий процесс из очереди получает доступ.

Важно различать блокировку записи и блокировку чтения (shared lock). Блокировка чтения позволяет нескольким процессам одновременно читать данные, но запрещает их изменение. Блокировка записи, напротив, запрещает как запись, так и чтение (в большинстве СУБД) со стороны других процессов, чтобы избежать чтения «грязных» данных (dirty read).

Виды блокировок записи

Блокировки записи классифицируются по различным признакам.

По уровню гранулярности

По способу реализации

По времени удержания

Механизмы реализации в популярных СУБД

PostgreSQL

PostgreSQL использует многовариантную модель управления параллельным доступом (MVCC), которая позволяет избежать многих конфликтов без явных блокировок. Однако блокировки записи всё же применяются:

MySQL (InnoDB)

InnoDB поддерживает блокировки на уровне строк с использованием механизма блокировок на основе индексов:

Microsoft SQL Server

SQL Server поддерживает блокировки на уровне строк, страниц и таблиц. Механизм блокировок динамически выбирает уровень гранулярности в зависимости от количества затрагиваемых строк. Блокировки записи могут быть эксклюзивными (X) или обновляемыми (U), причём U-блокировка позволяет избежать взаимоблокировок при чтении с намерением записи.

Oracle Database

Oracle использует MVCC и блокировки на уровне строк. Блокировка записи устанавливается только на изменяемые строки и не блокирует чтение (читатели не ждут писателей). Это достигается за счёт хранения старых версий данных в сегментах отката (undo segments).

Проблемы, связанные с блокировками записи

Взаимоблокировка (deadlock)

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

СУБД автоматически обнаруживает взаимоблокировки и прерывает одну из транзакций (обычно с откатом).

Голодание (starvation)

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

Снижение производительности

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

Применение в файловых системах

В файловых системах (например, NTFS, ext4) блокировка записи используется для предотвращения одновременного изменения файла несколькими процессами. Реализуется через системные вызовы (например, flock в Linux, LockFileEx в Windows). Блокировка может быть обязательной (mandatory) — операционная система принудительно блокирует доступ, или рекомендательной (advisory) — процессы должны добровольно проверять блокировку.

Примеры использования

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →