Что такое механизм MVCC в PostgreSQL и как он работает

Ответ

MVCC (Multi-Version Concurrency Control) — это основной механизм PostgreSQL для управления одновременным доступом к данным. Его ключевое преимущество — чтение данных никогда не блокирует запись, и наоборот.

Принцип работы

Вместо использования блокировок для каждой операции чтения, MVCC работает с версиями строк:

  1. Создание "снимка" данных: Каждая транзакция в момент своего старта получает "снимок" (snapshot) базы данных. Она видит только те данные, которые были зафиксированы (committed) до её начала.
  2. Версионирование строк:
    • При UPDATE строки старая версия не удаляется, а помечается как неактуальная. Рядом создается новая версия этой же строки.
    • При DELETE строка также не удаляется физически, а лишь помечается как удаленная для будущих транзакций.
  3. Изоляция транзакций: Активные транзакции продолжают работать со своими "снимками", игнорируя изменения, сделанные в других параллельных транзакциях, до тех пор, пока те не будут зафиксированы.
  4. Очистка: Фоновый процесс VACUUM периодически удаляет старые, уже невидимые ни для одной активной транзакции версии строк, освобождая место.

Пример

-- Исходное состояние: в таблице есть пользователь с именем 'Bob'
-- balance = 100

-- Транзакция 1 (началась в 10:00)
BEGIN;
SELECT balance FROM accounts WHERE user_id = 1; -- Видит balance = 100

-- Транзакция 2 (началась в 10:01, параллельно)
BEGIN;
UPDATE accounts SET balance = 150 WHERE user_id = 1;
COMMIT; -- Изменение зафиксировано

-- Транзакция 1 все еще работает со своим старым "снимком"
SELECT balance FROM accounts WHERE user_id = 1; -- По-прежнему видит balance = 100
COMMIT;

-- Новая транзакция, начатая после 10:01, увидит обновленное значение
SELECT balance FROM accounts WHERE user_id = 1; -- Увидит balance = 150

Этот подход обеспечивает высокую производительность в системах с большим количеством одновременных чтений и записей.