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