Что происходит на уровне базы данных во время выполнения транзакции?

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

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

Что ответить на собеседовании

В PostgreSQL транзакция работает с версиями строк и снимками MVCC, использует блокировки и журналирует изменения обычных таблиц в WAL. Commit фиксирует результат; при настройках надёжной синхронной фиксации WAL сохраняется до подтверждения клиенту, но все страницы данных немедленно записывать не требуется. Rollback отменяет видимость изменений через статус транзакции, а не универсальное физическое «проигрывание WAL назад». Внешний HTTP-вызов транзакция БД не откатывает.

Подробный разбор

Ответ с пояснениями

ACID описывает свойства транзакций, но конкретные механизмы зависят от СУБД. Рассмотрим PostgreSQL и обычные журналируемые таблицы.

После начала транзакции запросы используют снимки MVCC. При стандартном Read Committed обычный SELECT получает снимок на начало запроса, видит собственные изменения, но не читает незавершённые изменения других транзакций. Это поведение PostgreSQL нельзя автоматически переносить на все СУБД и уровни изоляции. Изоляция транзакций.

При изменениях появляются новые версии строк и служебные отметки; видимость определяется снимком и статусами транзакций. База проверяет ограничения и использует блокировки: например, конкурентное изменение одной строки может ожидать завершения другой транзакции. MVCC не означает отсутствия блокировок. MVCC, блокировки.

Изменения описываются в WAL. Соответствующие записи журнала должны попасть на надёжное хранилище до записи изменённых страниц данных. При COMMIT фиксируется результат транзакции; с включённым fsync и synchronous_commit=on подтверждение ожидает сохранения WAL. Не требуется немедленно переписывать все изменённые файлы таблиц: страницы могут записываться независимо. При асинхронной фиксации подтверждённые последние транзакции могут потеряться при сбое. Принцип WAL, настройки фиксации.

При ROLLBACK транзакция считается отменённой, её изменения не становятся видимыми другим транзакциям; ненужные версии очищаются позднее. Это не универсальное физическое восстановление всех страниц «по WAL назад». Обычные блокировки строк и таблиц освобождаются при завершении транзакции.

Условный пример Rails с настроенной связью User has_one :profile:

ActiveRecord::Base.transaction do
  user = User.create!(email: 'anna@example.org')
  user.create_profile!(display_name: 'Анна')
end

Операции должны использовать одно соединение. Если create! вызывает исключение, его не следует поглощать внутри блока: пусть Rails выполнит откат, а обработка произойдёт снаружи. ActiveRecord::Rollback — специальное исключение, которое после отката не распространяется дальше. Отправленное письмо или внешний HTTP-запрос не откатятся вместе с БД. Транзакции Active Record.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку