Lecciones del módulo (1/4)
Transacciones ACID (BEGIN/COMMIT)
Los fundamentos de la confiabilidad de cualquier base de datos se basan en el acrónimo ACID:
- Atomicidad: una operación se completa por completo (Commit) o falla sin dejar rastros a medio hacer (Rollback).
- Cconsistencia: las reglas de la base de datos (por ejemplo, restricciones, claves externas) siempre se respetan.
- Isolación: las transacciones que ocurren al mismo tiempo no interfieren entre sí de manera incontrolada.
- Durabilidad: después de una confirmación, el cambio se escribe irreversiblemente en el disco.
Sintaxis de transacción
Normalmente, cada consulta de ACTUALIZAR o ELIMINAR se trata como una transacción independiente (confirmación automática). Pero cuando desea agrupar varias operaciones, por ejemplo, cargar la cuenta del cliente y realizar el pedido, debe hacerlo explícitamente utilizando la sintaxis de transacción.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesSi durante estas complejas ejecuciones la aplicación JavaScript que envió la consulta se da cuenta de que hay un problema (por ejemplo, no hay suficiente stock en el almacén y falla), enviaría un:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockPruébalo tú mismo
Abra una transacción. Actualice el producto con ID 10 estableciendo su 'cantidad' en 0 en la tabla temporal (no espere, 'cantidad' no está en los productos, inventemos: cambie 'precio_unitario' en 'artículos_pedido' pero eso requiere una restricción. Hagámoslo mejor: actualice el estado del ID de pedido 5 a 'enviado' y complete con éxito la transacción.
Mostrar pista
Comience con BEGIN;, cambie los pedidos de id = 5 a status='enviado', luego envíelos con COMMIT;
Solución disponible después de 3 intentos
¡Pánico en producción! Un desarrollador escribió un DELETE sin el DÓNDE, históricamente borrando todas las reseñas. Mostrémosles cómo se realiza la reversión. Inicie una transacción, ejecute un DELETE rápido que borre todo, desde las 'revisiones' (sin una cláusula WHERE), pero luego use el salvavidas de SQL para deshacer el impacto antes de completar el bloque.
Mostrar pista
BEGIN;, la eliminación de borrón y cuenta nueva en 'reseñas', y luego el mágico ROLLBACK; al final.
Solución disponible después de 3 intentos