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

Многовариантная блокировка

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

История и предпосылки возникновения

Концепция многовариантной блокировки возникла как развитие идей, заложенных в протоколах управления параллелизмом, разработанных в 1970–1980-х годах. Классическая двухфазная блокировка, предложенная в 1976 году, гарантировала сериализуемость транзакций, но страдала от низкой пропускной способности из-за частых взаимных блокировок (deadlocks) и необходимости блокировать все используемые объекты на время выполнения транзакции.

В 1980-х годах, с ростом объёмов данных и числа одновременных пользователей, возникла потребность в более эффективных механизмах. Многовариантная блокировка (часто обозначаемая как MVCC-based locking) стала одним из решений, сочетающих элементы многоверсионного управления параллелизмом (MVCC) и традиционных блокировок. Впервые подобные подходы были реализованы в коммерческих СУБД, таких как Oracle (с версии 7, 1992 год) и PostgreSQL (с версии 6.5, 1999 год), где использовались не версии строк, а блокировки с разными уровнями изоляции.

Основные принципы

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

  • Блокировка чтения (S) — позволяет другим транзакциям читать данные, но не изменять их.
  • Блокировка записи (X) — запрещает любое обращение к объекту со стороны других транзакций.
  • Блокировка намерения (IS, IX, SIX) — указывает, что транзакция планирует выполнить операцию на более низком уровне иерархии (например, на уровне строки, а не таблицы).
  • Многовариантная блокировка (MV) — специальный тип, при котором транзакция может читать данные, не блокируя их, и одновременно удерживать блокировку на запись для других версий.

Ключевая особенность — совместимость блокировок определяется не только типом, но и версией данных. Если транзакция A удерживает блокировку чтения на версию 1 строки, транзакция B может получить блокировку записи на версию 2 той же строки (при условии, что версия 2 создаётся после завершения транзакции A). Это позволяет избежать конфликтов, характерных для строгой двухфазной блокировки.

Классификация многовариантных блокировок

По уровню иерархии

  • Многовариантные блокировки строк — наиболее распространённый тип, реализованный в Oracle, PostgreSQL, MySQL (InnoDB). Позволяет разным транзакциям одновременно читать и писать разные версии одной строки.
  • Многовариантные блокировки страниц — применяется в системах, где данные хранятся в виде страниц (например, Microsoft SQL Server). Блокировка накладывается на страницу, но версии строк внутри страницы могут различаться.
  • Многовариантные блокировки таблиц — используется в системах с полным копированием таблиц (например, в некоторых NoSQL-решениях). Транзакция может читать одну версию таблицы, а другая — писать в другую версию.

По типу совместимости

  • Совместимые блокировки — блокировки чтения (S) и многовариантные блокировки чтения (MV) обычно совместимы друг с другом, а также с блокировками намерения (IS, IX).
  • Несовместимые блокировки — исключительные блокировки (X) несовместимы с любыми другими блокировками, кроме многовариантных блокировок записи (MVX) в определённых условиях.
  • Частично совместимые блокировки — например, блокировка SIX (разделяемая с намерением исключительной) совместима с блокировками IS, но не с IX.

Устройство и механизм работы

В основе многовариантной блокировки лежит матрица совместимости, которая определяет, может ли новая блокировка быть наложена на объект, если на нём уже удерживается другая блокировка. В отличие от классической матрицы (где совместимы только S и S), многовариантная матрица включает дополнительные столбцы и строки для версий.

Пример упрощённой матрицы совместимости (для двух версий):

Текущая блокировкаНовая SНовая XНовая MV
SДаНетДа
XНетНетНет
MVДаДа (на другую версию)Да

При попытке наложения блокировки СУБД проверяет:

  1. Тип текущей блокировки.
  2. Версию данных, на которую она наложена.
  3. Версию, на которую запрашивается новая блокировка.

Если версии различаются, блокировки могут быть совместимы даже в случае, когда типы несовместимы в классическом смысле. Например, транзакция A удерживает MV-блокировку на версию 1 строки, а транзакция B запрашивает X-блокировку на версию 2 — это разрешено, так как версии не пересекаются.

Применение

Многовариантная блокировка широко используется в современных СУБД для обеспечения уровней изоляции транзакций, таких как Read Committed и Snapshot Isolation. В частности:

  • Oracle Database — использует многовариантную блокировку для реализации уровня изоляции Read Committed. При чтении транзакция видит последнюю зафиксированную версию данных, а при записи — блокирует только изменяемые строки, не мешая другим транзакциям читать старые версии.
  • PostgreSQL — применяет многовариантную блокировку в сочетании с MVCC. Каждая транзакция работает со своей копией данных, а блокировки накладываются только на момент фиксации.
  • MySQL (InnoDB) — использует многовариантные блокировки строк для поддержки Repeatable Read и Serializable. Блокировки намерения (IS, IX) позволяют эффективно управлять параллелизмом на уровне таблиц.
  • Microsoft SQL Server — поддерживает многовариантную блокировку через опцию READ_COMMITTED_SNAPSHOT, где чтение не блокирует запись, а запись не блокирует чтение (за счёт версий строк).

Преимущества и недостатки

Преимущества

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

Недостатки

  • Сложность реализации — требуется хранение нескольких версий данных, что увеличивает объём памяти и дискового пространства.
  • Риск аномалий — при неправильной настройке могут возникать фантомные чтения или неповторяемые чтения, если версии не синхронизированы.
  • Управление версиями — необходимость в сборке мусора (garbage collection) для удаления старых версий, что может снижать производительность при высокой интенсивности записи.

Критика и альтернативы

Многовариантная блокировка критикуется за то, что она не всегда гарантирует сериализуемость в классическом понимании. В некоторых реализациях (например, в Oracle) уровень изоляции Read Committed с многовариантной блокировкой допускает аномалии, такие как потерянные обновления. Для достижения полной сериализуемости часто требуется комбинация с другими механизмами, например, с оптимистической блокировкой или блокировками предикатов.

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

Источники

  • Gray, J., Reuter, A. (1993). Transaction Processing: Concepts and Techniques. Morgan Kaufmann.
  • Bernstein, P. A., Hadzilacos, V., Goodman, N. (1987). Concurrency Control and Recovery in Database Systems. Addison-Wesley.
  • Документация Oracle Database 19c: «Concurrency and Transaction Management».
  • Документация PostgreSQL 16: «Concurrency Control».
  • Документация MySQL 8.0: «InnoDB Locking and Transaction Model».

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

На главную BFOmetr →