Назад к вопросам
Junior
3
Расскажи про концепцию MVCC в PostgreSQL: как работает, bloat, vacuum, связь с уровнями изоляции транзакций.
Компании, где спрашивали
СБК ПАРУС
Ответ от нейросети
sobes.tech AI
MVCC (Multi-Version Concurrency Control) в PostgreSQL — это механизм управления параллелизмом, который позволяет транзакциям видеть согласованное состояние данных без блокировок на чтение.
Как работает:
- Каждая строка в таблице хранит информацию о версиях: xmin (ID транзакции, которая создала строку) и xmax (ID транзакции, которая удалила строку).
- Транзакция видит только те строки, которые были созданы до её начала и не удалены к моменту её начала.
- Таким образом, чтение не блокирует запись и наоборот.
Bloat:
- Из-за MVCC удалённые или обновлённые строки не удаляются сразу, а остаются как "мертвые" версии.
- Это приводит к росту размера таблиц (bloat), что снижает производительность.
Vacuum:
- Команда VACUUM очищает эти "мертвые" строки, освобождая место.
- Есть обычный VACUUM (освобождает место для повторного использования) и VACUUM FULL (физически сжимает таблицу).
Связь с уровнями изоляции:
- MVCC обеспечивает уровни изоляции READ COMMITTED и REPEATABLE READ.
- READ COMMITTED видит данные, подтверждённые на момент каждого запроса.
- REPEATABLE READ видит данные, подтверждённые на момент начала транзакции, обеспечивая стабильность чтения.
Пример: транзакция читает данные, пока другая транзакция обновляет строки — благодаря MVCC первая видит старую версию, вторая — новую, без блокировок.