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 высвобождать пространство и в крайних случаях может привести к отключению базы данных для предотвращения зацикливания ID транзакций (см. раздел Предотвращение ошибок зацикливания идентификатора транзакции). Также имейте в виду, что транзакция продолжает удерживать все свои блокировки. Предполагаемое использование этой функции заключается в том, что подготовленная транзакция обычно фиксируется или откатывается, как только внешний менеджер транзакций убедится, что другие базы данных также готовы к фиксации.

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

Примеры

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

PREPARE TRANSACTION 'foobar';

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

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

См. также

COMMIT PREPARED, ROLLBACK PREPARED