SAVEPOINT — define um novo ponto de salvamento dentro da transação corrente
SAVEPOINT nome_do_ponto_de_salvamento
O comando SAVEPOINT estabelece um novo
ponto de salvamento dentro da transação corrente.
O ponto de salvamento é uma marca especial dentro de uma transação, que permite que todos os comandos executados após o seu estabelecimento sejam desfeitos, restaurando o estado da transação para como estava no momento em que o ponto de salvamento foi estabelecido [156] [157].
nome_do_ponto_de_salvamentoO nome a ser dado ao novo ponto de salvamento. Se já existirem pontos de salvamento com o mesmo nome, eles ficarão inacessíveis até que novos pontos de salvamento com nomes idênticos sejam liberados.
Deve ser usado o comando ROLLBACK TO SAVEPOINT para desfazer a transação até o ponto de salvamento. Deve ser usado o comando RELEASE SAVEPOINT para liberar um ponto de salvamento, mantendo os efeitos dos comandos executados após o seu estabelecimento.
Os pontos de salvamento só podem ser estabelecidos dentro de um bloco de transação. Podem existir vários pontos de salvamento definidos em uma transação.
Para estabelecer um ponto de salvamento, e posteriormente desfazer os efeitos de todos os comandos executados após ele ter sido estabelecido:
CREATE TEMPORARY TABLE tabela1 (i integer);
BEGIN;
INSERT INTO tabela1 VALUES (1);
SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (2);
ROLLBACK TO SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (3);
SELECT * FROM tabela1;
i --- 1 3 (2 linhas)
COMMIT;
A transação acima insere na tabela os valores 1 e 3, mas não o valor 2.
Para estabelecer e depois liberar um ponto de salvamento:
TRUNCATE TABLE tabela1;
BEGIN;
INSERT INTO tabela1 VALUES (3);
SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (4);
RELEASE SAVEPOINT meu_ponto_de_salvamento;
SELECT * FROM tabela1;
i --- 3 4 (2 linhas)
COMMIT;
A transação acima insere na tabela os valores 3 e 4.
Para usar um único nome de ponto de salvamento:
TRUNCATE TABLE tabela1;
BEGIN;
INSERT INTO tabela1 VALUES (1);
SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (2);
SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (3);
-- desfazer até o segundo ponto de salvamento
ROLLBACK TO SAVEPOINT meu_ponto_de_salvamento;
SELECT * FROM tabela1; -- mostra as linhas com os valores 1 e 2
i --- 1 2 (2 linhas)
-- liberar o segundo ponto de salvamento
RELEASE SAVEPOINT meu_ponto_de_salvamento;
-- desfazer até o primeiro ponto de salvamento
ROLLBACK TO SAVEPOINT meu_ponto_de_salvamento;
SELECT * FROM tabela1; -- mostra apenas a linha com o valor 1
i --- 1 (1 linha)
COMMIT;
A transação acima mostra a linha com o valor 3 sendo desfeita primeiro, e depois a linha com o valor 2 sendo desfeita.
O padrão SQL requer que o ponto de salvamento seja
liberado automaticamente quando for estabelecido outro ponto de
salvamento com o mesmo nome.
No PostgreSQL, o ponto de salvamento
antigo é mantido, embora apenas o mais recente seja usado ao desfazer
ou liberar.
(Liberar o ponto de salvamento mais recente com o comando
RELEASE SAVEPOINT faz com que o mais antigo fique
novamente acessível para ROLLBACK TO SAVEPOINT e
RELEASE SAVEPOINT.)
Fora isto, o comando SAVEPOINT é totalmente
compatível com o padrão SQL.
[156]
Use o comando SAVEPOINT para criar um nome para
um número de alteração do sistema (SCN), para o qual se pode
desfazer posteriormente.
Os nomes dos pontos de salvamento devem ser distintos dentro de uma
determinada transação.
Se for criado um segundo ponto de salvamento com o mesmo
identificador de um ponto de salvamento anterior, o ponto de
salvamento anterior será apagado.
Após a criação de um ponto de salvamento, pode-se continuar o
processamento, efetivar o trabalho, desfazer toda a transação,
ou desfazer para o ponto de salvamento.
Oracle 21 – SAVEPOINT (N. T.)
[157]
Use o comando SAVEPOINT para definir um ponto
de salvamento em uma transação.
Este comando pode ser incorporado a um programa de aplicação
(incluindo um procedimento), ou executado interativamente.
É um comando executável que pode ser preparado dinamicamente.
IBM DB2 12.1.x – SAVEPOINT statement (N. T.)