Una transacción permite agrupar varias operaciones para que se comporten como una sola unidad. Es fundamental cuando un proceso no puede quedar “a mitad de camino”.
El problema de las operaciones parciales
En una transferencia bancaria hay dos pasos:
- restar dinero de una cuenta;
- sumarlo en otra.
Si el primer paso ocurre y el segundo falla, los datos quedan inconsistentes.
La idea de “todo o nada”
Una transacción agrupa instrucciones que pertenecen al mismo proceso de negocio. Si una falla, podemos evitar que las demás queden confirmadas.
El objetivo no es solo “poder deshacer”, sino mantener la base en un estado coherente.
START TRANSACTION
Marca el inicio de una transacción.
START TRANSACTION;
COMMIT
Confirma los cambios de forma definitiva.
Después de COMMIT, un ROLLBACK de esa misma transacción ya no puede revertirlos.
COMMIT;
ROLLBACK
Revierte los cambios realizados desde el inicio de la transacción.
ROLLBACK es útil cuando detectamos un error de validación, falta de stock, saldo insuficiente o cualquier condición que impida completar el proceso.
ROLLBACK;
Ejemplo completo
START TRANSACTION; UPDATE cuentas SET saldo = saldo - 1000 WHERE id = 1; UPDATE cuentas SET saldo = saldo + 1000 WHERE id = 2; COMMIT;
¿Qué pasaría si la segunda operación falla?
En el ejemplo de transferencia, si restamos 1000 de la cuenta 1 y luego falla la suma en la cuenta 2, debemos ejecutar ROLLBACK. Así el descuento inicial también se deshace.
Ese comportamiento es la base de la atomicidad.
Propiedades ACID
Atomicidad
Todo se ejecuta o nada se ejecuta.
Consistencia
La base debe pasar de un estado válido a otro estado válido.
Aislamiento
Transacciones concurrentes no deberían interferir incorrectamente.
Por ejemplo, dos ventas simultáneas no deberían descontar el mismo último producto sin coordinación.
Durabilidad
Una vez hecho COMMIT, los cambios deben persistir.
SAVEPOINT
Permite crear puntos intermedios dentro de una transacción.
START TRANSACTION; UPDATE productos SET stock = stock - 1 WHERE id = 10; SAVEPOINT despues_stock; UPDATE ventas SET estado = 'procesada' WHERE id = 50;
Podemos volver solo hasta ese punto:
ROLLBACK TO despues_stock;
RELEASE SAVEPOINT
Cuando ya no necesitamos un punto intermedio podemos liberarlo.
RELEASE SAVEPOINT despues_stock;
Autocommit
MySQL suele confirmar automáticamente cada sentencia individual cuando no hay una transacción explícita.
Eso significa que un UPDATE ejecutado fuera de una transacción puede quedar confirmado inmediatamente.
SELECT @@autocommit;
Ejemplo: venta y stock
START TRANSACTION; INSERT INTO ventas (cliente_id, total) VALUES (15, 25000); UPDATE productos SET stock = stock - 1 WHERE id = 3; COMMIT;
Transacciones y errores de aplicación
En una aplicación real, el código normalmente hace algo así:
- inicia la transacción;
- ejecuta las operaciones;
- si todo sale bien, hace COMMIT;
- si ocurre una excepción o validación fallida, hace ROLLBACK.
Cuándo usar transacciones
- pagos;
- transferencias;
- stock;
- facturas con detalles;
- procesos que modifican varias tablas.
Errores comunes
- olvidar COMMIT;
- no ejecutar ROLLBACK ante error;
- mantener transacciones abiertas demasiado tiempo;
- incluir tareas innecesarias dentro de la transacción.
Ejercicios
- crear una transferencia;
- simular un error y hacer ROLLBACK;
- registrar venta y descontar stock;
- crear y usar un SAVEPOINT.
¿Qué sigue?
Índices y optimización.
¿Te sirvió esta guía? ☕
Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:
Ruta SQL / MySQL
Ver todos los contenidos de SQL / MySQL
Descubre más desde Club Programador
Suscríbete y recibe las últimas entradas en tu correo electrónico.
Un comentario en “Transacciones en SQL: START TRANSACTION, COMMIT y ROLLBACK con ejemplos”