RELEASE SAVEPOINT — libera um ponto de salvamento definido previamente
RELEASE [ SAVEPOINT ] nome_do_ponto_de_salvamento
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].
nome_do_ponto_de_salvamentoO nome do ponto de salvamento a ser liberado.
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.
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)
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.
[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.)