ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT — revierte a un punto de salvaguarda (savepoint)

Synopsis

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

Descripción

Revierte todos los comandos que fueron ejecutados después de que se estableció el punto de salvaguarda y luego inicia una nueva subtransacción en el mismo nivel de transacción. El punto de salvaguarda sigue siendo válido y se puede volver a revertir a él más tarde, si es necesario.

ROLLBACK TO SAVEPOINT destruye implícitamente todos los puntos de salvaguarda que se establecieron después del punto de salvaguarda nombrado.

Parámetros

savepoint_name

El punto de salvaguarda al que se desea revertir.

Notas

Usa RELEASE SAVEPOINT para destruir un punto de salvaguarda sin descartar los efectos de los comandos ejecutados después de que se estableció.

Especificar un nombre de punto de salvaguarda que no ha sido establecido es un error.

Los cursores tienen un comportamiento no transaccional con respecto a los puntos de salvaguarda. Cualquier cursor que se abra dentro de un punto de salvaguarda se cerrará cuando se revierta el punto de salvaguarda. Si un cursor abierto previamente se ve afectado por un comando FETCH o MOVE dentro de un punto de salvaguarda que luego se revierte, el cursor permanece en la posición a la que apuntaba FETCH (es decir, el movimiento del cursor causado por FETCH no se revierte). Cerrar un cursor tampoco se deshace al revertir. Sin embargo, otros efectos secundarios causados por la consulta del cursor (como los efectos secundarios de funciones volátiles llamadas por la consulta) se revierten si ocurren durante un punto de salvaguarda que luego se revierte. Un cursor cuya ejecución hace que una transacción aborte se pone en un estado de «no se puede ejecutar», por lo que aunque la transacción se puede restaurar usando ROLLBACK TO SAVEPOINT, el cursor ya no se puede utilizar.

Ejemplos

Para deshacer los efectos de los comandos ejecutados después de que se estableció my_savepoint:

ROLLBACK TO SAVEPOINT my_savepoint;

Las posiciones del cursor no se ven afectadas por la reversión del punto de salvaguarda:

BEGIN;

DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column? 
----------
        1

ROLLBACK TO SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column? 
----------
        2

COMMIT;

Compatibilidad

El estándar SQL especifica que la palabra clave SAVEPOINT es obligatoria, pero PostgreSQL y Oracle permiten omitirla. SQL permite solo WORK, no TRANSACTION, como palabra de adorno después de ROLLBACK. Además, SQL tiene una cláusula opcional AND [ NO ] CHAIN que actualmente no es compatible con PostgreSQL. De lo contrario, este comando se ajusta al estándar SQL.

Consulte también

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, SAVEPOINT