Ответ
MVCC (Multi-Version Concurrency Control) — это основной механизм PostgreSQL для управления одновременным доступом к данным. Его ключевое преимущество — чтение данных никогда не блокирует запись, и наоборот.
Принцип работы
Вместо использования блокировок для каждой операции чтения, MVCC работает с версиями строк:
- Создание "снимка" данных: Каждая транзакция в момент своего старта получает "снимок" (snapshot) базы данных. Она видит только те данные, которые были зафиксированы (committed) до её начала.
- Версионирование строк:
- При
UPDATEстроки старая версия не удаляется, а помечается как неактуальная. Рядом создается новая версия этой же строки. - При
DELETEстрока также не удаляется физически, а лишь помечается как удаленная для будущих транзакций.
- При
- Изоляция транзакций: Активные транзакции продолжают работать со своими "снимками", игнорируя изменения, сделанные в других параллельных транзакциях, до тех пор, пока те не будут зафиксированы.
- Очистка: Фоновый процесс
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
Этот подход обеспечивает высокую производительность в системах с большим количеством одновременных чтений и записей.