PREPARE TRANSACTION

PREPARE TRANSACTION — подготовить текущую транзакцию для двухфазной фиксации


Синтаксис

PREPARE TRANSACTION id_транзакции

Описание

Команда PREPARE TRANSACTION подготавливает текущую транзакцию к двухфазной фиксации. После выполнения этой команды транзакция лишается связи с текущим сеансом; вместо этого ее состояние полностью сохраняется на диске, и она с очень большой вероятностью будет успешно зафиксирована, даже если сбой базы данных произойдет до запроса на фиксацию.

После подготовки транзакцию можно затем зафиксировать или откатить с помощью COMMIT PREPARED или ROLLBACK PREPARED соответственно. Эти команды можно вызвать из любого сеанса, а не только из того, в котором выполнялась исходная транзакция.

С точки зрения сеанса, выполняющего команду, PREPARE TRANSACTION не отличается от команды ROLLBACK: после ее выполнения нет активной текущей транзакции, и результаты этой подготовленной транзакции больше не видны. (Они снова станут видимыми, если транзакция фиксируется.)

Если команда PREPARE TRANSACTION по какой-либо причине завершается неудачно, то она действует как ROLLBACK: текущая транзакция отменяется.


Параметры

id_транзакции

Произвольный идентификатор, который позже определяет эту транзакцию для COMMIT PREPARED или ROLLBACK PREPARED. Идентификатор должен быть записан как строковый литерал и иметь длину менее 200 байт. Он не должен совпадать с идентификатором, используемым для любой текущей подготовленной транзакции.


Примечания

Команда PREPARE TRANSACTION не предназначена для использования в приложениях или интерактивных сеансах. Ее цель — позволить внешнему менеджеру транзакций выполнять атомарные глобальные транзакции, охватывающие несколько баз данных или других транзакционных ресурсов. Если вы не разрабатываете собственный менеджер транзакций, использовать PREPARE TRANSACTION не рекомендуется.

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

В настоящее время команда PREPARE не способна подготовить транзакцию, в которой выполнялись какие-либо операции с временными таблицами или временным пространством имен сеанса, создавались какие-либо курсоры WITH HOLD или выполнялись команды LISTEN, UNLISTEN или NOTIFY. Эти функциональные возможности слишком тесно связаны с текущим сеансом, чтобы быть полезными в транзакции, подлежащей подготовке.

Если транзакция изменила какие-либо параметры времени выполнения командой SET (без параметра LOCAL), их значения сохраняются после PREPARE TRANSACTION и не будут затронуты последующим выполнением команды COMMIT PREPARED или ROLLBACK PREPARED. То есть в этом отношении PREPARE TRANSACTION действует скорее как COMMIT, чем как ROLLBACK.

Все доступные в настоящее время подготовленные транзакции перечислены в системном представлении pg_prepared_xacts.

ВНИМАНИЕ!
Оставлять транзакции в подготовленном состоянии на длительное время неразумно. Это будет влиять на способность команды VACUUM высвобождать пространство и в крайних случаях может привести к отключению базы данных для предотвращения зацикливания идентификаторов транзакций (см. подраздел Предотвращение ошибок зацикливания идентификаторов транзакций). Также имейте в виду, что транзакция продолжает удерживать все свои блокировки. Предполагаемое использование этой особенности заключается в том, что подготовленная транзакция обычно фиксируется или откатывается, как только внешний менеджер транзакций убеждается, что другие базы данных тоже готовы к фиксации.

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


Примеры

Подготовка текущей транзакции для двухфазной фиксации, при этом ей назначается идентификатор foobar:

PREPARE TRANSACTION 'foobar';

Совместимость

Команда PREPARE TRANSACTION является расширением QHB. Она предназначена для использования внешними системами управления транзакциями, некоторые из которых включены в стандарты (например X/Open XA), но сторона SQL этих систем не стандартизирована.


См. также

COMMIT PREPARED, ROLLBACK PREPARED