> Что такое MVCC в PostgreSQL (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go, PostgreSQL

> Пример ответа

MVCC (Multiversion Concurrency Control) - это механизм управления конкурентным доступом к данным, основанный на создании нескольких версий строк. В PostgreSQL каждая транзакция видит "снимок" данных на момент своего начала, что позволяет избежать блокировок при чтении и обеспечивает изоляцию по стандарту ACID (уровни Read Committed и Serializable).

В PostgreSQL MVCC реализован через системные поля xmin и xmax в каждой строке. xmin хранит идентификатор транзакции, создавшей версию строки, а xmax - транзакции, удалившей или изменившей её. При чтении PostgreSQL проверяет видимость версии: если xmin завершена и не отменена, а xmax неактивна или равна текущей транзакции, строка считается видимой. Это позволяет читателям не ждать писателей, а писателям - не блокировать читателей.

Пример в Go с использованием database/sql:

GO
// Транзакция A: чтение без блокировки
txA, _ := db.Begin()
row := txA.QueryRow("SELECT balance FROM accounts WHERE id = 1")
var balance int
row.Scan(&balance) // видит версию на момент начала txA
// Транзакция B: обновление
txB, _ := db.Begin()
txB.Exec("UPDATE accounts SET balance = balance + 100 WHERE id = 1")
txB.Commit() // создаётся новая версия строки
// Транзакция A: повторное чтение - видит старую версию (если уровень Repeatable Read)
row = txA.QueryRow("SELECT balance FROM accounts WHERE id = 1")
row.Scan(&balance) // баланс не изменился
txA.Commit()

Недостаток MVCC - накопление "мёртвых" версий строк, которые удаляются фоновым процессом autovacuum. В Go-приложениях важно следить за параметрами vacuum и настраивать idle_in_transaction_session_timeout, чтобы избежать раздувания таблиц.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью