El Blog de over…

enero 15, 2008

Transacciones en PostgreSQL

Filed under: ./base\ de\ datos — elblogdeover @ 4:42 am

Las transacciones son un concepto fundamental en todos los sistemas de base de datos, el punto esencial de una transaccion es que engloba multiples operaciones en un solo paso. Por ejemplo, considere la base de datos de un banco que contiene balances para varias cuentas de clientes, supongamos que queremos registrar el pago de $100 desde la cuenta de Alice hacia la cuenta de Bob, las sentencias SQL a ejecutar para esta operacion serian como la siguiente:

UPDATE cuentas SET balance = balance – 100 WHERE nombre = ‘Alice’;
UPDATE branches SET balance = balance – 100 WHERE nombre = (SELECT branch_name FROM cuentas WHERE nombre = ‘Alice’);
UPDATE cuentas SET balance = balance + 100 WHERE nombre = ‘Bob’;
UPDATE branches SET balance = balance + 100 WHERE nombre = (SELECT branch_name FROM cuentas WHERE nombre = ‘Bob’);

Como se puede observar hay varias actualizaciones involucradas para terminar la operacion, los operadores del bando deben estar seguros de que todas esas actualizaciones se ejecuten, o en caso de falla que ninguna se ejecute, ya que se podria dar el caso de que Bob reciba $100 sin que sean debitados de la cuenta de Alice, Agrupando las actualizaciones en una sola transaccion se puede garantizar que en caso de un fallo ninguna actualizacion se ejecute.

En PostgreSQL las transacciones se configuran simplemente encerrando en un bloque las operaciones que se desean incluir en la misma, el bloque debe comenzar y terminar con los comandos BEGIN y COMMIT, por ejemplo:

BEGIN;
UPDATE cuentas SET balance = balance – 100 WHERE nombre = ‘Alice’;

COMMIT;

Al momento que se le pasa a postgresql la clausula COMMIT es cuando se escribe en base de datos las actualizacione u operacion que se desea hacer en la misma, si en algun momento no queremos hacer COMMIT de alguna operacion (quizas se nota que la cuenta de Alice da un balance negativo) entonces se puede utilizar la clausula ROLLBACK y todas las actualizaciones dentro de la transaccion se cancelaran.

Si no se desea hacer un rollback completo de la transaccion, entonces se pueden definir marcadores (savepoints) hasta los cuales se desea que se regrese en la transaccion, ejemplo:

BEGIN;
UPDATE cuentas SET balance = balance – 100 WHERE nombre = ‘Alice’;
SAVEPOINT marcador1;
UPDATE cuentas SET balance = balance + 100 WHERE nombre = ‘Bob’;
— se desea descartar la actualizacion para Bob y en vez hacerla para Wally —
ROLLBACK TO marcador1;
UPDATE cuentas SET balance = balance + 100 WHERE nombre = ‘Wally’;
COMMIT;

En el ejemplo anterior se vio el uso de Marcadores y Rollbacks, en este caso lo que paso es que se realizo una actualizacion sobre la cuenta de Bob, pero a ultima instacia se decide que el dinero no se le va a abonar a Bob sino a Wally, entonces se realiza un rollback hasta el marcador llamado marcador1 y se pasa a hacer la actualizacion en la cuenta de Wally.

6 comentarios »

  1. […] la cuenta de Bob, las sentencias SQL a ejecutar para esta operacion serian como la siguiente:Mas: https://elblogdeover.wordpress.com/2008/01/15/transacciones-en-postgresql/ […]

    Pingback por DbRunas - Transacciones en PostgreSQL — enero 16, 2008 @ 2:53 am

  2. muy bien explicado, gracias !

    Comentarios por makiolo — marzo 13, 2008 @ 6:54 pm

  3. Hola, Muy claro tu ejemplo de transacción, lo he realizado y todo marcha bien, gracias.

    Comentarios por luisa — abril 28, 2008 @ 7:27 pm

  4. y que pasa si quiero ejecutar la transaccion con PHP?

    Comentarios por ng — septiembre 5, 2008 @ 1:28 pm

  5. buen ejemplo gracias por tu contribuciones

    Comentarios por daniel — febrero 19, 2009 @ 10:45 pm

  6. gracias por tu colaboración es bueno que la gente comparta el conocimiento para que se progrese mas velozmente gracias de nuevo 😉

    Comentarios por andres — abril 2, 2009 @ 9:20 pm


RSS feed for comments on this post. TrackBack URI

Deja un comentario

Blog de WordPress.com.