CodeGym /Cursos /SQL SELF /Profundizando en transacciones

Profundizando en transacciones

SQL SELF
Nivel 39 , Lección 0
Disponible

Ya mencionamos antes en el curso qué es una transacción. Recuerda, es una secuencia de operaciones que debe ejecutarse como un todo. Por ejemplo, si tienes que hacer una transferencia bancaria. En ese caso, quitamos dinero de una cuenta y lo sumamos a otra. Si alguna de estas acciones falla (por ejemplo, el dinero se descuenta pero no se suma), eso crea un montón de problemas. Aquí es donde las transacciones nos salvan la vida.

Una transacción se ejecuta completamente o no se ejecuta para nada. Esto se llama el principio de "todo o nada".

BEGIN;
-- Disminuimos el saldo en una cuenta
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Aumentamos el saldo en otra cuenta
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- Aplicamos los cambios

Si algo sale mal, puedes deshacer los cambios usando ROLLBACK.

¿Qué son las propiedades ACID de las transacciones?

Cuando hablamos de transacciones en PostgreSQL (y en general en bases de datos relacionales), muchas veces aparece la abreviatura ACID — y no, no es de química. ACID significa Atomicity (atomicidad), Consistency (consistencia), Isolation (aislamiento), Durability (durabilidad). Estas cuatro propiedades aseguran que los datos se manejen de forma segura, consistente y sin sorpresas.

Atomicidad (Atomicity)
La transacción se ejecuta entera o no se ejecuta nada. Si algo falla dentro, todo se deshace. Imagina: transfieres dinero y de repente hay un error — o se cancela todo, o la transferencia se hace completa. Nada de operaciones "a medias".

Consistencia (Consistency)
Después de terminar la transacción, la base queda en un estado correcto y lógico. Todas las reglas, restricciones y relaciones entre tablas deben cumplirse. Por ejemplo, si no se permite saldo negativo, una transacción que lo rompa simplemente no se guarda.

Aislamiento (Isolation)
Mientras una transacción no termina, otra no debe ver sus datos intermedios. Esto protege de efectos raros, como ver un estado "indefinido" de los datos. Imagina que en una tienda online ya te descontaron el dinero, pero el producto aún no aparece en el pedido — no mola, ¿verdad?

Durabilidad (Durability)
Si la transacción terminó bien, todos sus cambios quedan guardados sí o sí. Incluso si justo después se va la luz — los datos siguen en la base. Es como darle a "Guardar" y saber que todo está seguro.

Estas cuatro propiedades son la base de por qué las transacciones son un mecanismo fiable para trabajar con bases de datos.

Ejemplos de escenarios donde usar transacciones

La teoría está bien, pero el verdadero poder de las transacciones se ve en tareas reales. Justo en esas situaciones — con dinero, tablas relacionadas o cambios masivos — las transacciones son imprescindibles. No solo te ayudan a hacer operaciones, sino a hacerlas con confianza, sin riesgo de perder datos o dejar la base en un estado "a medias".

Aquí tienes algunos ejemplos típicos donde las transacciones realmente salvan el día:

1. Procesar pagos

Cuando un cliente transfiere dinero de una cuenta a otra, la transacción garantiza que el dinero no desaparece ni de un lado ni del otro:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;

Si en la primera cuenta no hay suficiente saldo, puedes deshacer los cambios:

BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- Ups, saldo negativo!
ROLLBACK;

2. Actualizar tablas relacionadas

Imagina que actualizas el estado de un estudiante a "graduado" y al mismo tiempo añades un registro en la tabla "graduados":

BEGIN;
UPDATE students SET status = 'graduated' WHERE student_id = 42;
INSERT INTO graduates (student_id, graduation_date) VALUES (42, '2023-06-10');
COMMIT;

Si una de las operaciones falla (por ejemplo, hay un error en INSERT), la base de datos vuelve al estado inicial.

3. Actualización masiva de datos

Las transacciones son útiles para hacer grandes actualizaciones, por ejemplo:

BEGIN;
UPDATE orders SET status = 'completed' WHERE delivery_date < CURRENT_DATE;
COMMIT;

Si el servidor se cae o ves que la actualización no era la correcta, ¡puedes deshacer los cambios en cualquier momento!

Comandos para trabajar con transacciones

PostgreSQL te da varios comandos clave:

  • BEGIN: empieza una nueva transacción:

    BEGIN;
    
  • COMMIT: confirma (guarda) todos los cambios hechos en la transacción:

    COMMIT;
    

ROLLBACK: deshace todos los cambios hechos en la transacción actual:

ROLLBACK;

Ejemplo de ciclo completo

BEGIN;
-- Algunas operaciones
UPDATE accounts SET balance = balance - 200 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2;

-- Decidimos deshacer los cambios
ROLLBACK;

-- Empezamos de nuevo
BEGIN;
-- Las mismas operaciones, pero otra transferencia
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- Cerramos la transacción
COMMIT;

La vida de las transacciones fuera del libro

Tiendas online. Muchas plataformas usan transacciones para gestionar pedidos y pagos. Por ejemplo, el pedido solo se procesa si el pago fue exitoso. Si algo falla, el pedido se cancela automáticamente.

Sistemas bancarios. Las transacciones protegen tu dinero de problemas como un corte de luz inesperado.

Historial de transacciones. PostgreSQL guarda los logs WAL (Write-Ahead Logging) para recuperar datos en caso de fallo. Es la magia que hace que las transacciones sean fiables.

En la próxima lección veremos los comandos BEGIN, COMMIT y ROLLBACK más a fondo, y también ejemplos de operaciones masivas y deshacer parcial con SAVEPOINT. ¡Nos vemos!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION