RELEASE SAVEPOINT

RELEASE SAVEPOINT — libera um ponto de salvamento definido previamente

Sinopse

RELEASE [ SAVEPOINT ] nome_do_ponto_de_salvamento

Descrição

O comando RELEASE SAVEPOINT libera o ponto de salvamento indicado e todos os pontos de salvamento ativos criados posteriormente, além de liberar os recursos desses pontos de salvamento. Todas as alterações feitas após a criação desse ponto de salvamento, que ainda não tenham sido desfeitas, são incorporadas à transação ou ao ponto de salvamento que estava ativo quando o ponto de salvamento indicado foi criado. As alterações realizadas após a execução do comando RELEASE SAVEPOINT também farão parte desta transação ou do ponto de salvamento ativo [151].

Parâmetros

nome_do_ponto_de_salvamento

O nome do ponto de salvamento a ser liberado.

Notas

Especificar um nome de ponto de salvamento não definido anteriormente é um erro.

Não é possível liberar um ponto de salvamento quando a transação está no estado de interrompida; para fazer isto deve ser usado o comando ROLLBACK TO SAVEPOINT.

Se vários pontos de salvamento tiverem o mesmo nome, apenas aquele não liberado definido mais recentemente será liberado. A repetição do comando irá liberar pontos de salvamento progressivamente mais antigos.

Exemplos

Para criar e posteriormente liberar um ponto de salvamento:

BEGIN;
    INSERT INTO table1 VALUES (3);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (4);
    RELEASE SAVEPOINT my_savepoint;
COMMIT;

A transação acima irá inserir os números 3 e 4.

Um exemplo mais complexo com múltiplas subtransações aninhadas:

BEGIN;
BEGIN
CREATE TABLE tabela1 (n integer CHECK (n < 4));
CREATE TABLE
INSERT INTO tabela1 VALUES (1);
INSERT 0 1
SAVEPOINT sp1;
SAVEPOINT
INSERT INTO tabela1 VALUES (2);
INSERT 0 1
SAVEPOINT sp2;
SAVEPOINT
INSERT INTO tabela1 VALUES (3);
INSERT 0 1
RELEASE SAVEPOINT sp2;
RELEASE
INSERT INTO tabela1 VALUES (4);
ERRO:  a nova linha da relação "tabela1" viola
       a restrição de verificação "tabela1_n_check"
DETALHE:  Registro que falhou contém (4).
SELECT * FROM tabela1;
ERRO:  transação atual foi interrompida,
       comandos ignorados até o fim do bloco de transação

Neste exemplo, a aplicação solicita a liberação do ponto de salvamento sp2, que inseriu o valor 3. Isto muda o contexto da transação de inserção para sp1. Quando a instrução que tenta inserir o valor 4 gera um erro, a inserção dos valores 2 e 4 é perdida porque eles estão no mesmo ponto de salvamento, agora desfeito, e o valor 3 está no mesmo contexto da transação. A aplicação agora só pode escolher um destes dois comandos, porque todos os outros seriam ignorados:

ROLLBACK;
ROLLBACK TO SAVEPOINT sp1;

Escolher o ROLLBACK irá fazer com que tudo seja perdido, inclusive o valor 1 (e a tabela), enquanto escolher ROLLBACK TO SAVEPOINT sp1 irá manter o valor 1 e permitirá que a transação continue.

ROLLBACK TO SAVEPOINT sp1;
ROLLBACK
SELECT * FROM tabela1;

 n
---
 1
(1 linha)

Conformidade

Este comando está em conformidade com o padrão SQL. O padrão especifica que a palavra-chave SAVEPOINT é obrigatória, mas o PostgreSQL permite que seja omitida.

Veja também

BEGIN, COMMIT, ROLLBACK, ROLLBACK TO SAVEPOINT, SAVEPOINT


[151] O comando RELEASE SAVEPOINT é utilizado para indicar que a aplicação não deseja mais que o ponto de salvamento indicado seja mantido. Após esta instrução ser chamada, a volta ao ponto de salvamento não será mais possível. IBM DB2 12.1.x – RELEASE SAVEPOINT statement (N. T.)