SAVEPOINT — define un nuevo punto de salvaguarda (savepoint) dentro de la transacción actual
SAVEPOINT savepoint_name
SAVEPOINT establece un nuevo punto de salvaguarda dentro
de la transacción actual.
Un punto de salvaguarda es una marca especial dentro de una transacción que permite revertir todos los comandos que se ejecutaron después de que se estableció, restaurando el estado de la transacción a lo que era en el momento del punto de salvaguarda.
savepoint_nameEl nombre que se le dará al nuevo punto de salvaguarda. Si ya existen puntos de salvaguarda con el mismo nombre, serán inaccesibles hasta que se liberen los puntos de salvaguarda más nuevos con el mismo nombre.
Usa ROLLBACK TO para
revertir a un punto de salvaguarda. Usa RELEASE SAVEPOINT
para destruir un punto de salvaguarda, manteniendo
los efectos de los comandos ejecutados después de que se estableció.
Los puntos de salvaguarda solo se pueden establecer dentro de un bloque de transacción. Puede haber múltiples puntos de salvaguarda definidos dentro de una transacción.
Para establecer un punto de salvaguarda y luego deshacer los efectos de todos los comandos ejecutados después de que se estableció:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
La transacción anterior insertará los valores 1 y 3, pero no el 2.
Para establecer y luego destruir 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 3 como el 4.
Para usar un único nombre de punto de salvaguarda:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
-- revertir al segundo punto de salvaguarda
ROLLBACK TO SAVEPOINT my_savepoint;
SELECT * FROM table1; -- muestra las filas 1 y 2
-- liberar el segundo punto de salvaguarda
RELEASE SAVEPOINT my_savepoint;
-- revertir al primer punto de salvaguarda
ROLLBACK TO SAVEPOINT my_savepoint;
SELECT * FROM table1; -- muestra solo la fila 1
COMMIT;
La transacción anterior muestra cómo se revierte primero la fila 3 y luego la fila 2.
SQL requiere que un punto de salvaguarda se destruya automáticamente cuando se establece otro
punto de salvaguarda con el mismo nombre. En
PostgreSQL, se conserva el punto de salvaguarda antiguo, aunque solo se utilizará el más
reciente al revertir o liberar. (Liberar el punto de salvaguarda más nuevo con RELEASE SAVEPOINT
hará que el más antiguo vuelva a ser accesible para ROLLBACK TO SAVEPOINT y
RELEASE SAVEPOINT). De lo contrario, SAVEPOINT se
ajusta completamente a la especificación SQL.