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
ou ROLLBACK PREPARED
.
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.
id_transaction
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
.
Il n'est actuellement pas possible de préparer
(PREPARE
) une transaction qui a exécuté des opérations
impliquant des tables temporaires ou le schéma temporaire de la session,
ou qui a créé des curseurs
WITH HOLD
, ou qui a exécuté LISTEN
,
UNLISTEN
ou NOTIFY
. 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 25.1.5). 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';
PREPARE TRANSACTION
est une extension
PostgreSQL. Elle est conçue pour être utilisée
par des systèmes extérieurs de gestion des transactions. Certains de
ceux-là sont couverts par des standards (tels que X/Open XA),
mais la partie SQL de ces systèmes n'est pas standardisée.