Transacciones ACID
Una transacción agrupa múltiples operaciones SQL en una unidad indivisible. El ejemplo clásico es una transferencia bancaria: debes restar dinero de una cuenta Y sumarlo a otra. Si falla a mitad, sin transacción quedarías con dinero perdido. Con COMMIT confirmas todos los cambios, con ROLLBACK los deshaces todos.
Las propiedades ACID garantizan que las transacciones sean confiables: Atomicity (todo o nada), Consistency (los datos siempre pasan de un estado válido a otro), Isolation (las transacciones concurrentes no se interfieren entre sí), Durability (los datos confirmados persisten incluso ante fallos de hardware). ACID es por qué los bancos confían en SQL.
-- ACID:
-- Atomicity: Todo o nada. Si falla algo, todo se revierte.
-- Consistency: La BD siempre pasa de un estado válido a otro válido.
-- Isolation: Transacciones concurrentes no se interfieren.
-- Durability: Los datos comprometidos sobreviven a fallos del sistema.
-- Ejemplo clásico: transferencia bancaria
-- SIN transacción: si falla entre el débito y el crédito, el dinero desaparece
-- CON transacción: si falla, todo se revierte automáticamente
BEGIN; -- Iniciar transacción
-- Debitar de la cuenta origen
UPDATE cuentas
SET saldo = saldo - 500.00
WHERE id = 1 AND saldo >= 500.00;
-- Verificar que se actualizó (no había saldo insuficiente)
-- En una app real, verificarías el resultado aquí
-- Acreditar en la cuenta destino
UPDATE cuentas
SET saldo = saldo + 500.00
WHERE id = 2;
-- Registrar en el historial
INSERT INTO transferencias (origen_id, destino_id, monto, fecha)
VALUES (1, 2, 500.00, NOW());
COMMIT; -- Confirmar todos los cambios
-- Si algo falla, revertir todo:
-- ROLLBACK;
-- SAVEPOINT: punto de restauración parcial
BEGIN;
INSERT INTO pedidos (user_id, total) VALUES (1, 100.00);
SAVEPOINT despues_pedido;
INSERT INTO pagos (pedido_id, monto) VALUES (1, 100.00);
-- Si el pago falla, volver al savepoint (el pedido se conserva)
ROLLBACK TO SAVEPOINT despues_pedido;
-- Intentar pago alternativo...
INSERT INTO pagos (pedido_id, monto, metodo) VALUES (1, 100.00, 'paypal');
COMMIT;
-- Ver transacciones activas
SELECT pid, state, query, now() - query_start AS duracion
FROM pg_stat_activity
WHERE state = 'active';
Practica esta lección
Resuelve los ejercicios del curso de SQL y Bases de Datos en la app, gratis y con corrección automática.
Empezar a practicar