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