PREPARE TRANSACTION — prepara a transação corrente para efetivação em duas fases
PREPARE TRANSACTION id_da_transação
O comando PREPARE TRANSACTION prepara a transação
corrente para efetivação (commit)
em duas fases.
Após este comando, a transação não estará mais associada à sessão
corrente; em vez disso, seu estado fica inteiramente armazenado em
disco, havendo uma probabilidade muito alta de que possa ser
efetivada com sucesso, mesmo que ocorra uma falha no banco de dados
antes que a efetivação seja solicitada.
Após ser preparada, a transação poderá ser posteriormente efetivada, ou desfeita, usando os comandos COMMIT PREPARED ou ROLLBACK PREPARED, respectivamente. Estes comandos podem ser executados a partir de qualquer sessão, e não apenas daquela que executou a transação original.
Do ponto de vista da sessão que executa o comando,
PREPARE TRANSACTION não é diferente do comando
ROLLBACK: após executá-lo, não há mais transação
corrente ativa, e os efeitos da transação preparada não são mais
visíveis. (Os efeitos ficarão visíveis novamente se a transação
for efetivada.)
Se o comando PREPARE TRANSACTION falhar por
qualquer motivo, se tornará um ROLLBACK:
a transação corrente será desfeita.
id_da_transação
Um identificador arbitrário, que posteriormente identificará esta
transação para os comandos COMMIT PREPARED ou
ROLLBACK PREPARED.
O identificador deve ser escrito como um literal cadeia de
caracteres, devendo ter menos de 200 bytes de comprimento.
Não deve ser idêntico ao identificador usado para qualquer outra
transação preparada no momento.
O comando PREPARE TRANSACTION não se destina ao
uso em aplicações ou sessões interativas.
Sua finalidade é permitir que um gerenciador de transações externo
execute transações globais atômicas em vários servidores de bancos
de dados, ou outros recursos transacionais.
A menos que se esteja escrevendo um gerenciador de transações,
provavelmente não se deveria estar usando o comando
PREPARE TRANSACTION.
Este comando deve ser utilizado em um bloco de transação. Deve ser usado o comando BEGIN para começar um.
No momento não é permitido preparar uma transação que tenha executado
qualquer operação envolvendo tabelas temporárias ou espaço de
tabelas temporário da sessão, criado qualquer cursor
WITH HOLD, ou executado LISTEN,
UNLISTEN, ou NOTIFY.
Estas funcionalidades estão muito ligadas à sessão corrente para
serem úteis em uma transação a ser preparada.
Se a transação modificou qualquer parâmetro de tempo de execução
usando SET (sem a opção LOCAL),
estes efeitos irão persistir após o comando
PREPARE TRANSACTION, e não serão afetados por
qualquer comando COMMIT PREPARED ou
ROLLBACK PREPARED posterior.
Assim, neste aspecto o comando PREPARE TRANSACTION
age mais como um comando COMMIT do que como um
comando ROLLBACK.
Todas as transações preparadas atualmente disponíveis são listadas na visão do sistema pg_prepared_xacts.
Não é aconselhável deixar as transações no estado de preparada por
muito tempo.
Isto irá interferir na capacidade do comando VACUUM
recuperar o armazenamento e, em casos extremos, poderá fazer com que
o banco de dados seja parado para evitar o reinício do ID de transação
(veja Prevenção de falhas de recomeço de ID de transação).
Tenha em mente, também, que a transação continua a manter os
bloqueios que possuía.
O uso pretendido desse recurso é que normalmente a transação
preparada será efetivada, ou desfeita, assim que um gerenciador
de transação externo verificar que os outros bancos de dados
também estão preparados para a efetivação.
Se não foi configurado um gerenciador de transações externo para rastrear transações preparadas, e garantir que sejam fechadas prontamente, é melhor manter o recurso de transação preparada desativado definindo max_prepared_transactions como zero. Isto irá evitar a criação acidental de transações preparadas, que poderão ser esquecidas e por fim causarem problemas.
Preparar a transação corrente para efetivação de duas fases, usando
foobar como o identificador da transação:
PREPARE TRANSACTION 'foobar';
O comando PREPARE TRANSACTION é uma extensão do
PostgreSQL.
Destina-se ao uso por sistemas externos de gerenciamento de transações,
alguns dos quais são cobertos por padrões (como o
X/Open XA),
mas o lado SQL desses sistemas não é padronizado.
As transações que estão no momento preparadas para efetivação em duas fases podem ser consultadas através da visão do sistema pg_prepared_xacts.