ROLLBACK TO SAVEPOINT — desfaz até o ponto de salvamento
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] nome_do_ponto_de_salvamento
Desfaz todos os comandos executados após o estabelecimento do ponto de salvamento e, em seguida, inicia uma nova subtransação no mesmo nível de transação. O ponto de salvamento permanece válido, podendo ser desfeito até o mesmo novamente mais tarde, se necessário.
O comando ROLLBACK TO SAVEPOINT libera
implicitamente todos os pontos de salvamento estabelecidos
após o ponto de salvamento especificado.
[154]
[155]
nome_do_ponto_de_salvamentoO nome do ponto de salvamento para até o qual desfazer.
Deve ser usado RELEASE SAVEPOINT para liberar um ponto de salvamento sem desfazer os efeitos dos comandos executados após este ter sido estabelecido.
Especificar um nome de ponto de salvamento que não foi estabelecido é um erro.
Os cursores têm um comportamento um tanto não transacional em relação
aos pontos de salvamento.
Qualquer cursor aberto dentro de um ponto de salvamento será fechado
quando for desfeito até o ponto de salvamento.
Se um cursor aberto anteriormente tiver sido afetado por um comando
FETCH ou MOVE dentro de um
ponto de salvamento posteriormente desfeito, o cursor permanece na
posição em que o FETCH o deixou apontando
(ou seja, o movimento do cursor causado pelo FETCH
não é desfeito).
O fechamento do cursor também não é revertido ao desfazer.
Entretanto, outros efeitos colaterais causados pela consulta do cursor
(como efeitos colaterais de funções voláteis chamadas pela consulta)
são revertidos se ocorrerem durante um ponto de
salvamento posteriormente desfeito.
Um cursor cuja execução causa a interrupção de uma transação é
colocado em um estado impossível de executar, portanto, embora a
transação possa ser restaurada usando
ROLLBACK TO SAVEPOINT, o cursor não pode mais ser
usado.
Para desfazer os efeitos dos comandos executados após o
estabelecimento do meu_ponto_de_salvamento:
ROLLBACK TO SAVEPOINT meu_ponto_de_salvamento;
As posições dos cursores não são afetadas por desfazer até o ponto de salvamento:
BEGIN; DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; SAVEPOINT foo; FETCH 1 FROM foo;
?column?
----------
1
(1 linha)
ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo;
?column?
----------
2
(1 linha)
COMMIT;
O padrão SQL especifica que a palavra-chave
SAVEPOINT é obrigatória, mas o
PostgreSQL e o
Oracle permitem que ela seja omitida.
O padrão SQL permite apenas WORK,
e não TRANSACTION, como palavra de ruído após o
ROLLBACK.
Além disso, o padrão SQL tem a cláusula opcional
AND [ NO ] CHAIN que no momento não tem suporte
pelo PostgreSQL.
Fora isto, este comando está em conformidade com o padrão
SQL.
[154]
Use o comando ROLLBACK para desfazer o trabalho
feito na transação corrente, ou para desfazer manualmente o trabalho
feito por uma transação distribuída duvidosa.
A cláusula TO SAVEPOINT especifica o ponto de
salvamento para o qual se deseja desfazer a transação corrente.
Se esta cláusula for omitida, o comando ROLLBACK
irá desfazer toda a transação.
Oracle 21 – ROLLBACK (N. T.)
[155]
O comando ROLLBACK é usado para desfazer as
alterações no banco de dados que foram feitas em uma unidade de
trabalho ou num ponto de salvamento.
A cláusula TO SAVEPOINT especifica que deve ser
executada uma reversão parcial
(ROLLBACK TO SAVEPOINT).
Após uma reversão bem-sucedida, o ponto de salvamento continua
existindo, mas quaisquer pontos de salvamento aninhados são
liberados, não existindo mais.
IBM DB2 12.1.x – ROLLBACK statement (N. T.)