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 этих
систем не стандартизирована.