Transacciones en Una Base de Datos
Transacciones en Una Base de Datos
Transacciones en Una Base de Datos
• Una transacción es un conjunto de operaciones que se ejecutan en una base de datos, y que son
tratadas como una única unidad lógica por el SGBD.
• Es decir, una transacción es una o varias sentencias SQL que se ejecutan en una base de datos
como una única operación, confirmandose o deshaciendose en grupo.
• No todas las operaciones SQL son transaccionales. Sólo son transaccionales las operaciones
correspondiente al DML, es decir, sentencias SELECT, INSERT, UPDATE y DELETE
• Para confirmar una transacción se utiliza la sentencia COMMIT. Cuando realizamos
COMMIT los cambios se escriben en la base de datos.
• Para deshacer una transacción se utiliza la sentencia ROLLBACK. Cuando realizamos
ROLLBACK se deshacen todas las modificaciones realizadas por la transacción en la base de
datos, quedando la base de datos en el mismo estado que antes de iniciarse la transacción.
• Un ejemplo clásico de transacción son las transferencias bancarias. Para realizar una
transferencia de dinero entre dos cuentas bancarias debemos descontar el dinero de una cuenta,
realizar el ingreso en la otra cuenta y grabar las operaciones y movimientos necesarios,
actuaizar los saldos ... .Si en alguno de estos puntos se produce un fallo en el sistema
podríamos hacer descontado el dinero de una de las cuentas y no haberlo ingresado en la otra.
Por lo tanto, todas estas operaciones deben ser correctas o fallar todas. En estos casos, al
confirmar la transaccion (COMMIT) o al deshacerla (ROLLBACK) garantizamos que todos los
datos quedan en un estado consistente.
• En una transacción los datos modificados no son visibles por el resto de usuarios hasta que se
confirme la transacción.
• El siguiente ejemplo muestra una supuesta transacción bancaria:
DECLARE
importe NUMBER;
ctaOrigen VARCHAR2(23);
ctaDestino VARCHAR2(23);
BEGIN
importe := 100;
ctaOrigen := '2530 10 2000 1234567890';
ctaDestino := '2532 10 2010 0987654321';
UPDATE CUENTAS SET SALDO = SALDO - importe
WHERE CUENTA = ctaOrigen;
UPDATE CUENTAS SET SALDO = SALDO + importe
WHERE CUENTA = ctaDestino;
INSERT INTO MOVIMIENTOS
(CUENTA_ORIGEN, CUENTA_DESTINO,IMPORTE, FECHA_MOVIMIENTO)
VALUES
(ctaOrigen, ctaDestino, importe*(-1), SYSDATE);
INSERT INTO MOVIMIENTOS
(CUENTA_ORIGEN, CUENTA_DESTINO,IMPORTE, FECHA_MOVIMIENTO)
VALUES
(ctaDestino,ctaOrigen, importe, SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error en la transaccion:'||SQLERRM);
dbms_output.put_line('Se deshacen las modificaciones);
ROLLBACK;
END;
• Si alguna de las tablas afectadas por la transacción tiene triggers, las operaciones que realiza el
trigger están dentro del ambito de la transacción, y son confirmadas o deshechas conjuntamente
con la transacción.
• Durante la ejecución de una transacción, una segunda transacción no podrá ver los cambios
realizados por la primera transacción hasta que esta se confirme.
• ORACLE es completamente transaccional. Siempre debemos especificar si que queremos
deshacer o confirmar la transacion.