Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: MVCC, PostgreSQL, update, row version, isolation

Почему PostgreSQL создает новую версию строки при update?

Вопрос проверяет понимание механизма MVCC в PostgreSQL и объясняет, почему обновление строки не изменяет её на месте, а создает новую версию.

Короткий ответ

PostgreSQL использует механизм MVCC (Multiversion Concurrency Control) для обеспечения изоляции транзакций. При выполнении UPDATE создается новая версия строки, а старая помечается как устаревшая. Это позволяет разным транзакциям видеть разные версии данных без блокировок. Старые версии строк удаляются процессом VACUUM, когда они больше не нужны.

Длинный ответ

Что такое MVCC и зачем он нужен?

PostgreSQL использует механизм MVCC (Multiversion Concurrency Control) для управления конкурентным доступом к данным. Вместо того чтобы блокировать строки при обновлении, система создает новые версии строк, позволяя разным транзакциям видеть согласованное состояние данных на момент их начала.

Как работает UPDATE под капотом?

Когда выполняется UPDATE, PostgreSQL не изменяет существующую строку на месте. Вместо этого:

  • Старая версия строки помечается как неактивная (dead tuple) с указанием транзакции, которая её создала.
  • Создается новая версия строки (new tuple) с обновленными данными.
  • Индексы обновляются, чтобы указывать на новую версию.

Это позволяет другим транзакциям, начавшимся до обновления, продолжать видеть старую версию данных, обеспечивая уровень изоляции READ COMMITTED и выше.

Пример кода

-- Создаем таблицу
CREATE TABLE users (id INT PRIMARY KEY, name TEXT, balance INT);
INSERT INTO users VALUES (1, 'Alice', 100);

-- Транзакция 1
BEGIN;
UPDATE users SET balance = 200 WHERE id = 1;
-- Создана новая версия строки (balance=200), старая (balance=100) помечена как dead

-- Транзакция 2 (началась до UPDATE)
SELECT balance FROM users WHERE id = 1; -- Видит 100 (старую версию)

COMMIT; -- Новая версия становится видимой для всех последующих транзакций

Как очищаются старые версии?

Процесс VACUUM периодически удаляет dead tuples, которые больше не нужны ни одной активной транзакции. Если VACUUM не запускается, таблица может разрастаться (bloat), что ухудшает производительность.

Вывод: MVCC в PostgreSQL позволяет достичь высокой конкурентности без блокировок чтения, но требует регулярного обслуживания (VACUUM) для предотвращения разрастания таблиц. Этот механизм особенно полезен в системах с большим количеством параллельных транзакций, где важна согласованность данных.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Postgres

    Postgres

  • SQL

Ключевые слова

#MVCC

#PostgreSQL

#update

#row version

#isolation

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.