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

MVCC

MVCC (от англ. Multi-Version Concurrency Control, управление параллельным доступом с помощью многоверсионности) — это метод управления параллельными транзакциями в системах управления базами данных (СУБД), при котором каждой транзакции предоставляется «снимок» данных (snapshot) на определённый момент времени, а изменения, вносимые одной транзакцией, не видны другим транзакциям до их фиксации (commit). Основная цель MVCC — обеспечить согласованность данных при высокой степени параллелизма, минимизируя блокировки и конфликты между читающими и пишущими операциями.

История

Концепция многоверсионности была впервые предложена в 1970-х годах в исследовательских работах, посвящённых транзакционным системам. Значительный вклад в развитие MVCC внесли исследования Дэвида Рида (David Reed) в Массачусетском технологическом институте (MIT), который в 1978 году описал механизм управления параллельным доступом с использованием версий данных. В 1980-х годах идеи MVCC были реализованы в коммерческих СУБД, таких как Oracle (начиная с версии 3, 1983 год). В 1990-х и 2000-х годах MVCC стало стандартным подходом для многих реляционных СУБД (PostgreSQL, MySQL с InnoDB, Microsoft SQL Server — с опцией Snapshot isolation) и NoSQL-систем (CouchDB, MongoDB, Riak).

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

MVCC основан на идее, что каждый объект данных (строка, запись) может иметь несколько версий, соответствующих различным транзакциям. Каждая версия помечена идентификатором транзакции (Transaction ID, XID), которая её создала, и временем жизни (когда версия становится неактивной). Основные принципы включают:

Механизм работы

Версионирование строк

В большинстве реализаций MVCC каждая строка таблицы (или документ в NoSQL) содержит скрытые служебные поля:

Видимость версий

Для определения, видна ли версия строки текущей транзакции, используется проверка на основе идентификаторов транзакций:

Сборка мусора (vacuum, compaction)

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

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

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

Недостатки

Уровни изоляции и MVCC

MVCC поддерживает разные уровни изоляции транзакций, определённые стандартом SQL:

В PostgreSQL для обеспечения уровня REPEATABLE READ также применяется запрет на изменение строк, которые были прочитаны или изменены другими транзакциями (Snapshot Isolation, SI). Для SERIALIZABLE используется Serializable Snapshot Isolation (SSI).

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

PostgreSQL

PostgreSQL использует MVCC как основной механизм управления параллелизмом. Каждая транзакция получает уникальный идентификатор (XID). Система хранит несколько версий строк в основной таблице (heap). Для ускорения поиска видимых версий применяются индексные структуры. Сборка мусора реализована через фоновый процесс autovacuum. Уровни изоляции: READ COMMITTED (по умолчанию), REPEATABLE READ, SERIALIZABLE.

MySQL (InnoDB)

Движок InnoDB в MySQL реализует MVCC через систему версионирования с использованием rollback segment и undo log. При изменении строки старая версия помещается в undo log, а в главной таблице остаётся только текущая версия. Видимость строк определяется на основе transaction ID и списка активных транзакций (read view). InnoDB по умолчанию использует уровень изоляции REPEATABLE READ, который фактически реализует Snapshot Isolation.

Oracle Database

Oracle применяет MVCC в виде “Read Consistency” (согласованность чтения). Для каждой транзакции создаётся «снимок» данных на момент начала запроса. Старые версии хранятся в сегментах отката (undo segments). Oracle поддерживает уровни изоляции READ COMMITTED (по умолчанию), SERIALIZABLE и READ ONLY.

NoSQL-системы (MongoDB, CouchDB)

Применение и значение

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

Критика и ограничения

Тем не менее MVCC остаётся доминирующей парадигмой управления параллелизмом в базах данных XXI века благодаря балансу между производительностью и согласованностью.

Источники

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

На главную BFOmetr →