> Что такое снимок данных в PostgreSQL и как он работает (Go, PostgreSQL)

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

Компании: Ozon

Стек: Go, PostgreSQL

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

Снимок данных (snapshot) в PostgreSQL - это механизм, обеспечивающий согласованное представление данных на определённый момент времени в рамках MVCC (Multiversion Concurrency Control). Когда транзакция начинает выполнение, PostgreSQL фиксирует текущее состояние системы, записывая идентификаторы активных транзакций (txid). Этот снимок определяет, какие версии строк видимы для данной транзакции: она видит только те строки, которые были зафиксированы до начала снимка, и не видит строки, созданные или изменённые параллельными незавершёнными транзакциями.

Как это работает: каждая строка в таблице хранит информацию о создавшей её транзакции (xmin) и удалившей (xmax). При выполнении запроса PostgreSQL сравнивает эти идентификаторы со снимком. Например, в Go-приложении с использованием database/sql и драйвера pgx вы можете явно управлять изоляцией транзакций, чтобы получить нужный снимок:

GO
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelRepeatableRead})
if err != nil {
log.Fatal(err)
}
// Все последующие запросы в этой транзакции увидят один и тот же снимок данных,
// даже если другие транзакции изменят таблицы.
rows, err := tx.QueryContext(ctx, "SELECT * FROM users")

Таким образом, снимок гарантирует, что в рамках одной транзакции вы видите стабильное состояние базы, что особенно важно для отчётов или длительных операций, где требуется консистентность без блокировок.

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

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