Contenido de esta guía
Qué significa
Según el motor, una transacción explícita puede iniciarse con START TRANSACTION, BEGIN o BEGIN TRANSACTION. No son formas intercambiables en todos los dialectos: las sentencias posteriores forman una unidad hasta COMMIT o ROLLBACK solo cuando has utilizado la sintaxis de inicio válida para ese motor.
Qué problema resuelve
Algunas tareas necesitan varios cambios que solo tienen sentido juntos. Por ejemplo, descontar stock y registrar un pedido. Si una parte falla, conviene deshacer todo para no dejar datos incoherentes. La transacción crea ese límite de seguridad.
Flujo seguro: iniciar, comprobar, confirmar o deshacer. No dejes una transacción abierta mientras esperas una decisión del usuario o realizas trabajo lento.
Sintaxis habitual
START TRANSACTION;
-- sentencias
COMMIT;
-- Forma común en varios motores
BEGIN TRANSACTION;La forma exacta y las opciones disponibles dependen del motor y del cliente. PostgreSQL admite BEGIN como equivalente funcional de START TRANSACTION; MySQL documenta START TRANSACTION y sus sinónimos; SQLite permite iniciar manualmente con BEGIN; SQL Server utiliza BEGIN TRANSACTION y un BEGIN aislado solo delimita un bloque de instrucciones.
Ejemplo guiado
| id | nombre | stock |
|---|---|---|
| 1 | Ratón | 18 |
Probamos una reducción de stock y decidimos deshacerla:
BEGIN TRANSACTION;
UPDATE productos
SET stock = stock - 1
WHERE id = 1;
SELECT id, nombre, stock
FROM productos
WHERE id = 1;
ROLLBACK;| id | nombre | stock |
|---|---|---|
| 1 | Ratón | 17 |
Después de ROLLBACK, el stock vuelve a 18. Si hubiéramos ejecutado COMMIT, el cambio habría quedado confirmado.
Cómo razonar el bloque
BEGIN TRANSACTIONabre la unidad de trabajo.UPDATErealiza el cambio dentro de la transacción abierta; la visibilidad para otras sesiones depende del aislamiento y del motor.SELECTpermite revisar el cambio antes de decidir.ROLLBACKdescarta todo lo realizado desde el inicio.
Error frecuente
Iniciar y olvidar cerrar
BEGIN;
UPDATE productos SET stock = stock - 1 WHERE id = 1;
-- Falta COMMIT o ROLLBACKUna transacción abierta puede conservar bloqueos o recursos y retrasar a otras sesiones. El código debe cerrar todos los caminos, incluidos los casos de error.
Comprueba lo aprendido
Prueba una reducción de stock y verifica la vuelta atrás
Inicia una transacción, reduce en 2 unidades el stock del producto con id 2, consulta el valor dentro de la transacción, ejecuta ROLLBACK y vuelve a consultar para confirmar que recupera el valor inicial.
UPDATE debe incluir WHERE id = 2.SELECT después de ROLLBACK.Solución razonada
BEGIN TRANSACTION;
UPDATE productos
SET stock = stock - 2
WHERE id = 2;
SELECT id, nombre, stock
FROM productos
WHERE id = 2;
ROLLBACK;
SELECT id, nombre, stock
FROM productos
WHERE id = 2;| momento | id | nombre | stock |
|---|---|---|---|
| Dentro de la transacción | 2 | Teclado | 5 |
| Después de ROLLBACK | 2 | Teclado | 7 |
El primer SELECT permite revisar el cambio provisional. El segundo demuestra que ROLLBACK restauró el estado anterior.
Autocommit y diferencias entre motores
Muchos clientes trabajan en modo autocommit: cada sentencia fuera de una transacción explícita se confirma por separado. PostgreSQL acepta BEGIN como forma de iniciar la transacción. En SQL Server debes usar BEGIN TRANSACTION; BEGIN por sí solo delimita un bloque de instrucciones y no inicia una transacción.
Los nombres, modos de aislamiento, bloqueos y reglas de anidamiento varían. Antes de usar transacciones en producción, comprueba el motor, el driver y la herramienta desde la que ejecutas SQL, y mantén el bloque tan corto como permita la operación.
Qué debes recordar
BEGINoSTART TRANSACTIONinicia una unidad de trabajo explícita.COMMITconserva sus cambios yROLLBACKlos descarta.- Revisa el alcance antes de confirmar y mantén la transacción lo más breve posible.
- Comprueba el modo autocommit y la sintaxis concreta de tu motor.
Conceptos relacionados
Fuentes técnicas consultadas
Se utilizaron para comprobar las formas de inicio y los matices entre motores. La explicación y los ejemplos son originales.