SAVEPOINT

SAVEPOINT — define um novo ponto de salvamento dentro da transação corrente

Sinopse

SAVEPOINT nome_do_ponto_de_salvamento

Descrição

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].

Parâmetros

nome_do_ponto_de_salvamento

O 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.

Notas

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.

Exemplos

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.

Conformidade

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.

Veja também

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, ROLLBACK TO SAVEPOINT


[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.)