RELEASE SAVEPOINT — libera un punto de salvaguarda (savepoint) definido previamente
RELEASE [ SAVEPOINT ] savepoint_name
RELEASE SAVEPOINT libera el punto de salvaguarda nombrado y
todos los puntos de salvaguarda activos que se crearon después del mismo,
y libera sus recursos. Todos los cambios realizados desde la creación del
punto de salvaguarda que no hayan sido revertidos previamente se fusionan en
la transacción o punto de salvaguarda que estaba activo cuando se creó el
punto de salvaguarda nombrado. Los cambios realizados después de RELEASE SAVEPOINT
también formarán parte de esta transacción o punto de salvaguarda activo.
savepoint_nameEl nombre del punto de salvaguarda a liberar.
Especificar un nombre de punto de salvaguarda que no fue definido previamente es un error.
No es posible liberar un punto de salvaguarda cuando la transacción se encuentra en un estado abortado; para hacer eso, utiliza ROLLBACK TO SAVEPOINT.
Si múltiples puntos de salvaguarda tienen el mismo nombre, solo se libera el definido más recientemente que no haya sido liberado. Comandos repetidos liberarán progresivamente puntos de salvaguarda más antiguos.
Para establecer y posteriormente liberar un punto de salvaguarda:
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT my_savepoint;
COMMIT;
La transacción anterior insertará tanto el valor 3 como el 4.
Un ejemplo más complejo con múltiples subtransacciones anidadas:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT sp1;
INSERT INTO table1 VALUES (2);
SAVEPOINT sp2;
INSERT INTO table1 VALUES (3);
RELEASE SAVEPOINT sp2;
INSERT INTO table1 VALUES (4))); -- genera un error
En este ejemplo, la aplicación solicita la liberación del punto de salvaguarda
sp2, el cual insertó el valor 3. Esto cambia el contexto de transacción
de la inserción a sp1. Cuando la sentencia que intenta insertar
el valor 4 genera un error, las inserciones de 2 y 4 se pierden debido a que están
en el mismo punto de salvaguarda, ahora revertido, y el valor 3 está en el mismo
contexto de transacción. La aplicación ahora solo puede elegir uno de estos dos comandos,
ya que todos los demás comandos serán ignorados:
ROLLBACK; ROLLBACK TO SAVEPOINT sp1;
Elegir ROLLBACK abortará todo, incluyendo el
valor 1, mientras que ROLLBACK TO SAVEPOINT sp1 retendrá
el valor 1 y permitirá que la transacción continúe.
Este comando cumple con el estándar SQL. El estándar
especifica que la palabra clave SAVEPOINT es
obligatoria, pero PostgreSQL permite que
se omita.