ROLLBACK TO SAVEPOINT — revierte a un punto de salvaguarda (savepoint)
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
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.
savepoint_nameEl punto de salvaguarda al que se desea revertir.
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) sí
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.
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;
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.