Lecciones del módulo (4/4)
Transacciones: todo o nada
Una transacción es un grupo de operaciones que la base de datos trata como
una sola unidad: o todos triunfan, o ninguno deja una
rastro. Así es como te proteges de las inconsistencias cuando una secuencia
de UPDATE/INSERT/DELETE debe permanecer consistente.
La sintaxis
BEGIN; -- apri la transazione
UPDATE …;
INSERT …;
DELETE …;
SELECT …; -- puoi anche solo leggere
COMMIT; -- conferma tutte le modifiche
-- oppure
ROLLBACK; -- annulla tutte le modifiche, come se nulla fosseTodo entre BEGIN y COMMIT es atómico: no hay otra conexión
ve el estado intermedio. Si el programa falla o se ejecuta
ROLLBACK, la base de datos permanece exactamente como estaba antes de BEGIN.
El escenario clásico: el traspaso
El ejemplo canónico es una transferencia de acciones entre productos (o una transferencia de dinero).
transferencia entre cuentas): dos UPDATE que deben tener éxito juntos,
Nunca uno si y el otro no.
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;Si el segundo UPDATE falla (por ejemplo, un error de restricción CHECK), se
ROLLBACK restablece el stock del producto 1 a su valor original.
ROLLBACK: el depurador del DBA
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1; -- "vedo come è cambiato"
ROLLBACK;Un patrón muy útil para probar un UPDATE en datos reales:
ejecutarlo, inspeccionar el resultado con un SELECT en la misma transacción, y
si no te convence, usa ROLLBACK: la base de datos es exactamente como
fue antes.
SAVEPOINT: reversión parcial
Dentro de una transacción puedes crear puntos intermedios:
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT; -- solo il primo UPDATE viene confermatoÁCIDO en 30 segundos
Las transacciones garantizan las propiedades ACID:
- Atomicidad: todo o nada;
- Cconsistencia: las restricciones se mantienen satisfechas al inicio y al final de la transacción;
- Isolación: las transacciones simultáneas no ven estados intermedios (en varios "niveles");
- Durabilidad: un
COMMITexitoso no se pierde incluso en caso de falla.
Tu turno
En una sola transacción: disminuir en 1 el stock del producto 1 e incrementar en 1 el stock del producto 2. Abrir con BEGIN y cerrar con COMMIT.
Mostrar pista
Valor de referencia - 1 y valor + 1 en las respectivas cláusulas SET.
Solución disponible después de 3 intentos
Ejercicio de revisión
Abra una transacción, intente actualizar la ciudad del cliente con id=1 a 'Sperimentale', luego cancele la operación con ROLLBACK. Al final la ciudad del cliente 1 debe ser la original ('Milano').
Mostrar pista
ROLLBACK cancela todos los cambios realizados desde BEGIN en adelante.
Solución disponible después de 3 intentos