¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Todo o nada: las transacciones

Después de esta lección: Puedo explicar por qué una transferencia tiene que ser todo o nada.

Lección de 45 minSin comandos

Trescientos euros que desaparecen

Trabajas en una aplicación de pagos. Elena envía 300 € a Raúl.

El programa resta 300 € de la cuenta de Elena. Justo después, el servidor se reinicia.

Elena ya no tiene ese dinero y Raúl no lo ha recibido. Para un banco, ese es el peor fallo posible. Las transacciones existen para que no ocurra.

Al final de esta lección

Nota

Puedo explicar por qué una transferencia tiene que ser todo o nada.

Palabras clave

PalabraQué significaEjemplo
Transacciónun grupo de cambios que se guardan juntos o no se guardan
BEGINabre una transacción
COMMITconfirma los cambios y los hace definitivos
ROLLBACKdeshace todos los cambios desde BEGIN
UPDATEcambia valores de filas que ya existenUPDATE accounts SET balance = 200

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una transferencia son dos escrituras

Mover dinero exige dos cambios: restar en una cuenta y sumar en la otra.

Entre los dos cambios hay un momento en que el dinero no está en ningún sitio. Si algo falla justo ahí, el total de las cuentas ya no cuadra.

La tabla de abajo enseña ese momento. Nadie debería verlo nunca.

Ejemplo: los saldos paso a paso

MomentoElenaRaúlTotal
Antes500 €100 €600 €
Después de restar200 €100 €300 €
Después de sumar200 €400 €600 €

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

BEGIN y COMMIT guardan todo junto

BEGIN abre una transacción. Los cambios que siguen quedan pendientes.

COMMIT los confirma todos a la vez. Hasta ese momento, nadie más ve los cambios a medias.

Si el servidor se cae antes del COMMIT, la base de datos descarta lo pendiente al arrancar. Nunca se queda con la mitad.

Prueba: una transferencia confirmada

Código: sql
-- Elena paga 300 euros a Raúl.
BEGIN;
UPDATE accounts SET balance = balance - 300 WHERE id = 1;
UPDATE accounts SET balance = balance + 300 WHERE id = 2;
COMMIT;

-- Los dos saldos han cambiado y el total sigue siendo 600.
SELECT owner, balance FROM accounts;
SELECT SUM(balance) AS total FROM accounts;

ROLLBACK lo deshace todo

A veces la aplicación ve un problema a mitad: no hay saldo, o la cuenta de destino está bloqueada.

Entonces envía ROLLBACK. La base de datos deshace todos los cambios desde BEGIN.

Las cuentas vuelven a estar como antes, como si la transferencia no hubiera empezado.

Prueba: una transferencia anulada

Código: sql
-- La misma transferencia, pero algo va mal a mitad.
BEGIN;
UPDATE accounts SET balance = balance - 300 WHERE id = 1;
-- Aquí la aplicación detecta un error y lo anula todo.
ROLLBACK;

-- Elena sigue teniendo 500 euros.
SELECT owner, balance FROM accounts;

-- Cambia ROLLBACK por COMMIT y vuelve a ejecutar. ¿Adónde van los 300 euros?

Un error frecuente

Advertencia

Mucha gente cree que, si algo falla, la base de datos lo deshace sola. Solo lo hace dentro de una transacción. Sin BEGIN, cada UPDATE se guarda en cuanto termina, y el primero se queda aunque falle el segundo.

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.