PREPARE TRANSACTION — pr�pare la transaction en cours pour une validation en deux phases
PREPARE TRANSACTION id_transaction
PREPARE TRANSACTION pr�pare la transaction courante en vue d'une validation en deux phases. À la suite de cette commande, la transaction n'est plus associ�e � la session courante ; au lieu de cela, son �tat est enti�rement stock� sur disque. La probabilit� est donc forte qu'elle puisse �tre valid�e avec succ�s, y compris en cas d'arr�t brutal de la base de donn�es avant la demande de validation.
Une fois pr�par�e, une transaction peut �tre valid�e ou annul�e ult�rieurement par, respectivement, COMMIT PREPARED(7) et ROLLBACK PREPARED(7). Ces commandes peuvent �tre ex�cut�es � partir d'une session quelconque. Il n'est pas n�cessaire de le faire depuis celle qui a ex�cut� la transaction initiale.
Du point de vue de la session l'initiant, PREPARE TRANSACTION diff�re peu de la commande ROLLBACK : apr�s son ex�cution, il n'y a plus de transaction active et les effets de la transaction pr�par�e ne sont plus visibles. (Les effets redeviendront visibles si la transaction est valid�e.)
Si la commande PREPARE TRANSACTION �choue, quelqu'en soit la raison, elle devient une commande ROLLBACK : la transaction courante est annul�e.
Un identifiant arbitraire de la transaction pour les commandes COMMIT PREPARED et ROLLBACK PREPARED. L'identifiant, obligatoirement de type cha�ne litt�rale, doit �tre d'une longueur inf�rieure � 200 octets. Il ne peut �tre identique � un autre identifiant de transaction pr�par�e.
PREPARE TRANSACTION n'a pas pour but d'�tre utilis� dans des applications ou des sessions interactives. Son but est de permettre � un gestionnaire de transactions externe pour r�aliser des transactions globales atomiques au travers de plusieurs bases de donn�es ou de ressources transactionnelles. Sauf si vous �crivez un gestionnaire de transactions, vous ne devriez probablement pas utiliser PREPARE TRANSACTION.
Cette commande doit �tre utilis�e dans un bloc de transaction, initi� par BEGIN(7).
Il n'est actuellement pas possible de pr�parer (PREPARE) une transaction qui a ex�cut� des op�rations impliquant des tables temporaires ou qui a cr�� des curseurs WITH HOLD, ou qui a ex�cut� LISTEN ou UNLISTEN. Ces fonctionnalit�s sont trop int�gr�es � la session en cours pour avoir la moindre utilit� dans une transaction pr�par�e.
Si la transaction a modifi� des param�tres en ex�cution � l'aide de la commande SET (sans l'option LOCAL), ces effets persistent au-del� du PREPARE TRANSACTION et ne seront pas affect�s par les commandes COMMIT PREPARED et ROLLBACK PREPARED. Du coup, dans ce cas, PREPARE TRANSACTION agit plus comme COMMIT que comme ROLLBACK.
Toutes les transactions pr�par�es disponibles sont list�es dans la vue syst�me pg_prepared_xacts.
Il est pr�f�rable de ne pas conserver trop longtemps des transactions pr�par�es dans cet �tat ; cela compromet, par exemple, les possibilit�s de r�cup�ration de l'espace par VACUUM, et dans certains cas extr�mes peut causer l'arr�t de la base de donn�es pour emp�cher une r�utilisation d'identifiants de transactions (voir Section 23.1.5, � Éviter les cycles des identifiants de transactions �). Il ne faut pas oublier non plus qu'une telle transaction maintient les verrous qu'elle a pos�. L'usage principal de cette fonctionnalit� consiste � valider ou annuler une transaction pr�par�e d�s lors qu'un gestionnaire de transactions externe a pu s'assurer que les autres bases de donn�es sont pr�par�es � la validation.
Si vous n'avez pas configur� un gestionnaire de transactions externe pour g�rer les transactions pr�par�es et vous assurer qu'elles sont ferm�es rapidement, il est pr�f�rable de d�sactiver la fonctionnalit� des transactions pr�par�es en configurant max_prepared_transactions � z�ro. Ceci emp�chera toute cr�ation accidentelle de transactions pr�par�es qui pourraient alors �tre oubli�es, ce qui finira par causer des probl�mes.
Pr�parer la transaction en cours pour une validation en deux phases en utilisant foobar comme identifiant de transaction :
PREPARE TRANSACTION 'foobar';