Aller au contenu

Two-Phase Commit

Exemple de Transaction Préparée

Tout commence comme une transaction normale :

test=# BEGIN;
BEGIN
test=# DELETE from stock;
DELETE 1000000
test=# PREPARE TRANSACTION 'b';
PREPARE TRANSACTION

La transaction est terminée par l’ordre PREPARE TRANSACTION. Dans les faits, cela donne un résultat similaire à un ROLLBACK :

test=# select count(*) from stock;
  count
---------
 1000000
(1 row)

La transaction n’a pas été effectuée.

On peut alors lancer d’autres transactions sans problèmes :

test=# BEGIN; SELECT now(); COMMIT;
BEGIN
              now
-------------------------------
 2010-02-24 16:55:35.961911+01
(1 row)

COMMIT

On peut ensuite à tout moment décider d’appliquer la transaction préparée :

test=# select count(*) from stock;
  count
---------
 1000000
(1 row)

test=# COMMIT PREPARED 'b';
COMMIT PREPARED
test=# select count(*) from stock;
 count
-------
     0
(1 row)