Transacciones · recuperación parcial

SAVEPOINT

Marca un punto seguro dentro de una transacción para poder deshacer solo las operaciones posteriores.

Lectura: 5–7 minEjemplo comprobadoPráctica con pistas
Contenido de esta guía

Qué es un SAVEPOINT

SAVEPOINT crea una marca con nombre dentro de una transacción. Si una operación posterior sale mal, puedes volver a esa marca sin descartar necesariamente todo lo que hiciste antes dentro de la misma transacción.

Es útil cuando una tarea tiene varias etapas y quieres conservar las primeras aunque tengas que repetir una etapa posterior. No sustituye a COMMIT: los cambios siguen pendientes hasta que la transacción completa se confirma.

El flujo: crear, probar, volver o liberar

  1. Abre una transacción.
  2. Realiza una primera parte válida.
  3. Crea un SAVEPOINT.
  4. Prueba la parte arriesgada.
  5. Si falla tu comprobación, usa ROLLBACK TO SAVEPOINT nombre.
  6. Cuando ya no necesites la marca, puedes liberarla con RELEASE SAVEPOINT nombre.

Idea clave: volver a un savepoint no equivale a cerrar toda la transacción. El trabajo anterior a la marca sigue dentro de la transacción y todavía necesita un COMMIT o un ROLLBACK final.

Ejemplo: conservar una reserva y deshacer un descuento excesivo

El producto 2 empieza con 7 unidades. Reservamos 2, creamos una marca y después probamos una segunda reducción que decidimos deshacer.

SQL · SQLite/PostgreSQL
BEGIN;

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

SAVEPOINT reserva_validada;

UPDATE productos
SET stock = stock - 5
WHERE id = 2;

ROLLBACK TO SAVEPOINT reserva_validada;

SELECT stock AS stock_antes_de_commit
FROM productos
WHERE id = 2;

COMMIT;
Resultado tras volver a la marca
stock_antes_de_commit
5

La primera reducción queda pendiente; la segunda se revierte. Si finalmente ejecutas COMMIT, se conserva el stock 5.

ROLLBACK y ROLLBACK TO no resuelven lo mismo

SentenciaEfecto
ROLLBACKAbandona la transacción completa.
ROLLBACK TO SAVEPOINT puntoDeshace el trabajo posterior a la marca y permite continuar.
RELEASE SAVEPOINT puntoElimina esa marca; no confirma por sí sola la transacción exterior.

Error frecuente

Creer que RELEASE equivale siempre a COMMIT

En una transacción exterior, liberar un savepoint no vuelve permanentes los cambios por sí mismo. Si luego haces ROLLBACK de la transacción exterior, también se pierden los cambios que habían quedado después de RELEASE.

Comprueba lo aprendido

Intermedia · transacciones

Protege una segunda modificación

Escribe una secuencia que reduzca en 1 el stock del producto 5, cree el savepoint primera_reserva, reduzca después otras 3 unidades y deshaga únicamente esa segunda reducción. Termina consultando el stock antes del COMMIT.

Compatibilidad

PostgreSQL, SQLite y MySQL disponen de savepoints, pero hay matices de sintaxis y de comportamiento en contextos específicos. SQLite permite savepoints anidados; PostgreSQL documenta SAVEPOINT, ROLLBACK TO SAVEPOINT y RELEASE SAVEPOINT como operaciones de la transacción actual. Comprueba también si tu framework crea savepoints automáticamente.

Qué debes recordar

  • Un savepoint marca un estado intermedio dentro de una transacción.
  • ROLLBACK TO permite repetir una parte sin abandonar necesariamente todo el trabajo.
  • RELEASE elimina la marca, pero no sustituye al COMMIT exterior.
  • Usa nombres que indiquen qué estado ya ha sido validado.

Conceptos relacionados

Fuentes técnicas