Sobes.tech
Назад к вопросам
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 первая видит старую версию, вторая — новую, без блокировок.