PREPARE TRANSACTION#
PREPARE TRANSACTION
PREPARE TRANSACTION — подготовить текущую транзакцию для двухфазного коммита
Синтаксис
PREPARE TRANSACTION transaction_id
Описание
PREPARE TRANSACTION
готовит текущую транзакцию
для двухфазного коммита. После этой команды транзакция больше не
связана с текущей сессией; вместо этого ее состояние полностью сохраняется на
диске, и существует очень высокая вероятность, что она может быть успешно
подтверждена, даже если произойдет сбой базы данных перед запросом на коммит.
После подготовки транзакцию можно позднее подтвердить или откатить с помощью COMMIT PREPARED
или ROLLBACK PREPARED
соответственно. Эти команды могут быть выполнены из любой сессии, а не только из той, которая выполнила исходную транзакцию.
С точки зрения выполняющейся сессии, команда PREPARE
TRANSACTION
не отличается от команды ROLLBACK
:
после ее выполнения нет активной текущей транзакции, и
эффекты подготовленной транзакции больше не видны. (Эффекты
станут видны снова, если транзакция будет подтверждена).
Если команда PREPARE TRANSACTION
не выполняется по какой-либо
причине, она приводит к ROLLBACK
: текущая транзакция
отменяется.
Параметры
transaction_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
освободить место, и в экстремальных случаях может привести к остановке базы данных для предотвращения зацикливания идентификаторов транзакций (см. Раздел 23.1.5). Также имейте в виду, что транзакция продолжает удерживать все предыдущие блокировки. Предполагается, что подготовленная транзакция будет обычно подтверждена или откатана, как только внешний менеджер транзакций проверит, что другие базы данных также готовы к коммиту.
Если вы не настроили внешний менеджер транзакций для отслеживания подготовленных транзакций и обеспечения их своевременного закрытия, лучше отключить функцию подготовленных транзакций, установив значение max_prepared_transactions равным нулю. Это предотвратит случайное создание подготовленных транзакций, которые могут быть забыты и в конечном итоге вызвать проблемы.
Примеры
Подготовьте текущую транзакцию для двухфазного коммита, используя foobar
в качестве идентификатора транзакции:
PREPARE TRANSACTION 'foobar';
Совместимость
PREPARE TRANSACTION
- это расширение Tantor BE. Оно предназначено для использования внешними системами управления транзакциями, некоторые из которых покрываются стандартами (например, X/Open XA), но SQL-часть этих систем не является стандартизированной.