Skip to content

7. Gestión de Transacciones (TCL)

El Lenguaje de Control de Transacciones (TCL - Transaction Control Language) es un componente fundamental de SQL que permite gestionar transacciones en bases de datos. Las transacciones garantizan la integridad de los datos al asegurar que las operaciones relacionadas se ejecuten como una unidad atómica, manteniendo la base de datos en un estado consistente incluso en caso de fallos.

Una transacción es una secuencia de operaciones que se ejecutan como una única unidad lógica de trabajo. Las transacciones deben cumplir con las propiedades ACID:

  • Atomicidad: Una transacción se ejecuta por completo o no se ejecuta en absoluto.
  • Consistencia: Una transacción lleva la base de datos de un estado válido a otro estado válido.
  • Aislamiento: Las transacciones se ejecutan de forma aislada, sin interferir entre sí.
  • Durabilidad: Una vez confirmada una transacción, sus cambios persisten incluso ante fallos del sistema.

7.2. Iniciar transacciones (BEGIN, START TRANSACTION)

Section titled “7.2. Iniciar transacciones (BEGIN, START TRANSACTION)”

Para iniciar una transacción explícitamente, se utilizan los comandos BEGIN o START TRANSACTION.

-- Iniciar una transacción
START TRANSACTION;
-- o
BEGIN;
-- Operaciones dentro de la transacción
UPDATE cuentas SET saldo = saldo - 1000 WHERE id_cuenta = 1;
UPDATE cuentas SET saldo = saldo + 1000 WHERE id_cuenta = 2;
-- Iniciar transacción de solo lectura
START TRANSACTION READ ONLY;
-- Iniciar transacción con escritura
START TRANSACTION READ WRITE;
-- Iniciar transacción con un nivel de aislamiento específico
START TRANSACTION ISOLATION LEVEL SERIALIZABLE;

El comando COMMIT finaliza la transacción actual y hace permanentes todos los cambios realizados durante la transacción.

-- Iniciar transacción
START TRANSACTION;
-- Operaciones
UPDATE productos SET stock = stock - 5 WHERE id_producto = 101;
INSERT INTO ventas (id_producto, cantidad, fecha) VALUES (101, 5, NOW());
-- Confirmar cambios
COMMIT;

El comando ROLLBACK deshace todos los cambios realizados durante la transacción actual y finaliza la transacción.

-- Iniciar transacción
START TRANSACTION;
-- Operaciones
UPDATE cuentas SET saldo = saldo - 5000 WHERE id_cuenta = 1;
-- Verificar saldo resultante
SELECT saldo FROM cuentas WHERE id_cuenta = 1;
-- Si el saldo es negativo, deshacer la transacción
ROLLBACK;
-- Establecer que los errores provoquen un rollback automático
SET autocommit = 0;
START TRANSACTION;
-- Si esta operación falla, toda la transacción se revertirá
UPDATE cuentas SET saldo = saldo - 1000 WHERE id_cuenta = 1;
-- Esta operación provocaría un error si la cuenta 999 no existe
UPDATE cuentas SET saldo = saldo + 1000 WHERE id_cuenta = 999;
-- Si llegamos aquí sin errores, confirmamos
COMMIT;

7.5. Puntos de guardado (SAVEPOINT, RELEASE SAVEPOINT)

Section titled “7.5. Puntos de guardado (SAVEPOINT, RELEASE SAVEPOINT)”

Los puntos de guardado (savepoints) permiten dividir una transacción en partes más pequeñas, lo que posibilita revertir la transacción hasta un punto específico sin deshacer toda la transacción.

-- Iniciar transacción
START TRANSACTION;
-- Primera operación
INSERT INTO pedidos (cliente_id, fecha) VALUES (101, NOW());
SET @id_pedido = LAST_INSERT_ID();
-- Crear un punto de guardado después de insertar el pedido
SAVEPOINT pedido_creado;
-- Añadir productos al pedido
INSERT INTO detalles_pedido (pedido_id, producto_id, cantidad) VALUES (@id_pedido, 1, 2);
INSERT INTO detalles_pedido (pedido_id, producto_id, cantidad) VALUES (@id_pedido, 2, 1);
-- Crear otro punto de guardado
SAVEPOINT productos_agregados;
-- Actualizar inventario
UPDATE productos SET stock = stock - 2 WHERE id = 1;
-- Si hay un problema con el inventario, volver al punto anterior
-- ROLLBACK TO productos_agregados;
-- Si todo está bien, confirmar
COMMIT;
-- Eliminar un punto de guardado
RELEASE SAVEPOINT pedido_creado;

El control de concurrencia garantiza que múltiples transacciones puedan ejecutarse simultáneamente sin comprometer la integridad de los datos.

Los niveles de aislamiento definen cómo las transacciones interactúan entre sí:

  1. READ UNCOMMITTED: Permite leer cambios no confirmados (dirty reads).
  2. READ COMMITTED: Solo permite leer cambios confirmados.
  3. REPEATABLE READ: Garantiza que las lecturas repetidas dentro de una transacción devuelvan los mismos resultados.
  4. SERIALIZABLE: El nivel más estricto, las transacciones se ejecutan como si fueran secuenciales.
-- Establecer nivel de aislamiento para la sesión
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- Establecer nivel de aislamiento para una transacción específica
START TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- Bloquear tablas para lectura
LOCK TABLES empleados READ;
-- Bloquear tablas para escritura
LOCK TABLES empleados WRITE;
-- Liberar todos los bloqueos
UNLOCK TABLES;
-- Bloquear filas para actualización
SELECT * FROM empleados WHERE departamento_id = 10 FOR UPDATE;
  1. Lecturas sucias (Dirty Reads): Una transacción lee datos que otra transacción ha modificado pero aún no ha confirmado.

  2. Lecturas no repetibles (Non-repeatable Reads): Una transacción lee el mismo registro dos veces y obtiene valores diferentes porque otra transacción modificó el registro entre las lecturas.

  3. Lecturas fantasma (Phantom Reads): Una transacción ejecuta una consulta dos veces y la segunda vez aparecen registros adicionales porque otra transacción insertó nuevos registros que cumplen con los criterios de la consulta.

  4. Bloqueos muertos (Deadlocks): Dos transacciones se bloquean mutuamente, cada una esperando recursos que la otra tiene bloqueados.

Comparación de niveles de aislamiento y problemas de concurrencia

Section titled “Comparación de niveles de aislamiento y problemas de concurrencia”
Nivel de aislamientoLecturas suciasLecturas no repetiblesLecturas fantasma
READ UNCOMMITTEDPosiblePosiblePosible
READ COMMITTEDNoPosiblePosible
REPEATABLE READNoNoPosible (MySQL: No)
SERIALIZABLENoNoNo

La gestión adecuada de transacciones es fundamental para mantener la integridad de los datos en sistemas de bases de datos. Las transacciones garantizan que las operaciones relacionadas se ejecuten como una unidad atómica, permitiendo deshacer cambios en caso de errores y asegurando que la base de datos permanezca en un estado consistente incluso en entornos multiusuario con acceso concurrente.

🐝