Обычный COMMIT завершает локальную транзакцию. PREPARE TRANSACTION сохраняет готовность участника, а окончательное завершение откладывает до решения распределённого менеджера.
Почему это важно
Подготовка участника не доказывает, что заказ окончательно зафиксирован у всех. Если координатор недоступен, нужно восстановить достоверное решение, пока подготовленные транзакции могут удерживать ресурсы.
Что подтверждено
2PC отделяет готовность участников от окончательного решения о фиксации или откате. Распределённая атомарность требует согласованного решения корректного менеджера транзакций, а не только успешного PREPARE у одного участника.
Граница применимости: Классическая модель распределённой фиксации и механизм подготовленных транзакций PostgreSQL 18.
PostgreSQL предназначает PREPARE TRANSACTION для внешнего менеджера транзакций. Менеджер должен доводить подготовленные транзакции до окончательного решения и восстанавливать эту работу после сбоя.
Граница применимости: PostgreSQL 18; подготовленная транзакция не является удобной заменой обычной долгой транзакции приложения.
После PREPARE TRANSACTION состояние сохраняется независимо от исходного сеанса и может пережить сбой базы. Другой сеанс позже завершает его командой COMMIT PREPARED или ROLLBACK PREPARED по идентификатору.
Граница применимости: Подготовленные транзакции PostgreSQL 18 при исправном устойчивом хранении; действуют права на завершение транзакции.
Подготовленная транзакция продолжает удерживать свои блокировки и мешать очистке старых версий VACUUM. Долгое забытое состояние поэтому может блокировать работу и обслуживание базы даже без живого исходного сеанса.
Граница применимости: Эксплуатационные последствия подготовленных транзакций PostgreSQL 18.
Успешный PREPARE заканчивает текущую транзакцию сеанса, но ещё не фиксирует её результат окончательно. Подготовленную работу нельзя продолжить обычными SQL-операциями как прежнюю открытую транзакцию; её нужно завершить отдельным решением.
Граница применимости: PostgreSQL 18, состояние после PREPARE TRANSACTION до COMMIT PREPARED или ROLLBACK PREPARED.
Недоступность координатора или большой возраст подготовленной транзакции не доказывает общего решения об откате. Произвольное завершение участника без восстановления решения может разойтись с уже принятым исходом у других участников.
Граница применимости: Вывод из двухфазной фиксации и независимого prepared-состояния PostgreSQL 18; тайм-аут — повод для расследования, а не свидетельство безопасного отката.
PostgreSQL не позволяет подготовить транзакцию, затронувшую временные таблицы, создавшую курсор WITH HOLD или выполнившую LISTEN, UNLISTEN либо NOTIFY. Поддержку PREPARE нужно проверять для фактического состава работы участника.
Граница применимости: Ограничения PREPARE TRANSACTION PostgreSQL 18; не полный перечень требований менеджера транзакций.
Не путать
Атомарность — требование общего результата в заданной границе. 2PC — способ координировать его между участниками ценой подготовленного состояния и зависимости от восстановления решения.
Что проверить
- Перечислите участников и назовите ответственный менеджер транзакций.
- Проверьте, что каждый участник поддерживает подготовку своего фактического набора операций.
- Отделите подтверждение PREPARE от окончательного решения о заказе.
- Сохраните идентификаторы участников и доступный после сбоя журнал решения координатора.
- Наблюдайте число и возраст подготовленных транзакций, блокировки и влияние на VACUUM.
- Испытайте сбой координатора до и после принятия окончательного решения.
- Завершайте забытое состояние по установленному общему решению, а не по одному тайм-ауту.
Первоисточники
The Transaction Model — Turing Award Lecture
Microsoft Research / ACM · Jim Gray, FCRC 1999 lecture slides
Первичный обзор transaction model, ACID, concurrency anomalies, logs и two-phase commit.
Открыть первоисточникPostgreSQL 18 Documentation: PREPARE TRANSACTION
PostgreSQL Global Development Group · PostgreSQL 18 SQL command reference
Описывает prepared transaction, external transaction manager и operational risk forgotten prepared state.
Открыть первоисточник