Este es el Post #14 del Topic: Guía Práctica de PostgreSQL
El Lenguaje de Control Transacciones (Transaction Control Language – TCL) se utilizan para administrar los procesos transaccionales en una base de datos en relación a los requerimientos de atomicidad, cosistencia, aislamiento y durabilidad.
Las clásulas TCL que se utilizan en PostgreSQL para este fin son:
COMMIT
ROLLBACK
SAVEPOINT
En este post describiremos las maneras de llevar a cabo el control de errores ayudándonos de Error Codes donde podemos ver las variables de errores que necesitaremos.
Al igual que la mayoria de casos prácticos que estoy desarrollando bajo postgres, éste también fue tomado de mi curso de base de datos (en SQLServer) desarrollados en la universiadad.
CASO PRÁCTICO:
Transacción para transferir 50 € desde una cuenta A a una cuenta B:
1- CREACIÓN DE TABLA Y CHECK:
--DROP TABLE tblCuenta; CREATE TABLE tblCuenta(NumCuenta char,Monto numeric(10,3)); INSERT INTO tblCuenta VALUES('A',100); INSERT INTO tblCuenta VALUES('B',100); ALTER TABLE tblCuenta ADD CONSTRAINT ck_monto CHECK (Monto >=0); --No Negativos
2- SECUENCIA DE EJECUCIÓN:
–1. leer(A)
–2. A = A – 50
–3. escribir(A)
–4. leer(B)
–5. B = B + 50
–6. escribir(B)
3- CREACIÓN DE LA FUNCIÓN:
CREATE OR REPLACE FUNCTION transaccion1() RETURNS VOID AS $body$ DECLARE A numeric; B numeric; BEGIN /*1*/A := (SELECT monto from tblCuenta where NumCuenta = 'A'); /*2*/A := A - 50; /*3*/update tblCuenta set Monto = A where NumCuenta = 'A'; /*4*/B := (SELECT monto from tblCuenta where NumCuenta = 'B'); /*5*/B := B + 50; /*6*/update tblCuenta set Monto = B where NumCuenta = 'B'; RAISE NOTICE 'Guardado'; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; $body$ LANGUAGE 'plpgsql';
4- COMPROBANDO:
SELECT * FROM transaccion1(); SELECT * FROM tblCuenta;
EL hecho de transferir dinero de una cuenta a otra requiere que toda la operación sea ejecutado como un todo, decía mi profe ‘HACE TODO O NADA’, de esa manera garantizamos la integridad de la transacción, por ejemplo si se presenta un error en medio de la transferencia todo el procesos queda invalidado.
Queda claro que Postgres realiza las transacciones implicitamente
Es importante nombrar los 4 requisitos que deben de cumplirse en un transferencia:
Requisito de atomicidad: Se realiza todo o nada
Requisito de consistencia: A+B (INICIAL) = A+B (FINAL)
Requisito de aislamiento: Durante la operacion se bloquea otros accesos.
Requisito de durabilidad: Una vez actualizado debe quedar permanentemente.
RAISE NOTICE 'Monto Insuficiente';
para mi gusto a este tema le hace falta mas detalle y/o mas ejemplos practicos para validar y pasar mejor lo prendido, mil gracias