Transacciones · guía rápida

BEGIN / START TRANSACTION

Marca el comienzo de un bloque de trabajo que debe terminar con COMMIT para guardar los cambios o con ROLLBACK para deshacerlos.

Lectura: 7–9 minEjemplo paso a pasoPráctica con pistas
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

Formas frecuentes: elige la de tu motor
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

Estado inicial del producto
idnombrestock
1Ratón18

Probamos una reducción de stock y decidimos deshacerla:

SQL
BEGIN TRANSACTION;

UPDATE productos
SET stock = stock - 1
WHERE id = 1;

SELECT id, nombre, stock
FROM productos
WHERE id = 1;

ROLLBACK;
Valor visible dentro de la transacción antes de ROLLBACK
idnombrestock
1Ratón17

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

  1. BEGIN TRANSACTION abre la unidad de trabajo.
  2. UPDATE realiza el cambio dentro de la transacción abierta; la visibilidad para otras sesiones depende del aislamiento y del motor.
  3. SELECT permite revisar el cambio antes de decidir.
  4. ROLLBACK descarta todo lo realizado desde el inicio.

Error frecuente

Iniciar y olvidar cerrar

Bloque incompleto
BEGIN;
UPDATE productos SET stock = stock - 1 WHERE id = 1;
-- Falta COMMIT o ROLLBACK

Una 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

Básica · cambio reversible

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.

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

  • BEGIN o START TRANSACTION inicia una unidad de trabajo explícita.
  • COMMIT conserva sus cambios y ROLLBACK los 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.