Inicio > Cursos > SQL y Bases de Datos > Transacciones ACID
SQL y Bases de DatosDiseño y OptimizaciónLección 13 de 20

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';
ConsejoMantén las transacciones cortas. Una transacción larga mantiene bloqueos que impiden a otras transacciones acceder a las filas afectadas. En aplicaciones web, cada request debería completar su transacción en milisegundos.
← Índices y RendimientoVistas y Funciones →

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