Desfaz todos os comandos que foram executados após o estabelecimento do ponto de salvamento. O ponto de salvamento permanece válido, sendo possível desfazer até este ponto de salvamento novamente se for necessário. [1] [2] [3]
O comando ROLLBACK TO SAVEPOINT destrói, implicitamente, todos os pontos de salvamento que foram estabelecidos após o ponto de salvamento especificado.
Para destruir um ponto de salvamento, sem rejeitar os efeitos dos comandos executados após este ponto de salvamento ter sido estabelecido, deve ser utilizado o comando RELEASE SAVEPOINT.
A especificação de um nome de ponto de salvamento que não tenha sido estabelecido anteriormente é um erro.
Os cursores possuem um comportamento um tanto não transacional com respeito aos pontos de salvamento. Os cursores abertos dentro de um ponto de salvamento não são fechados quando se desfaz até o ponto de salvamento. Se um cursor aberto anteriormente for afetado pelo comando FETCH dentro de um ponto de salvamento, e a transação for desfeita até o ponto de salvamento, a posição do cursor permanecerá apontando para onde o comando FETCH a deixou (ou seja, o comando FETCH não será desfeito). O fechamento do cursor também não é desfeito. Um cursor cuja execução tenha causado a interrupção da transação (abort) é colocado no estado de não poder executar e, portanto, embora a transação possa ser restaurada utilizando o comando ROLLBACK TO SAVEPOINT o cursor não poderá ser mais 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 ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo; ?column? ---------- 2 COMMIT;
O padrão SQL:2003 especifica que a palavra chave SAVEPOINT é obrigatória, mas o PostgreSQL e o Oracle permitem que seja omitida. O padrão SQL:2003 permite apenas WORK, e não TRANSACTION, como palavra sem efeito (noise word) após o ROLLBACK. Além disso, o padrão SQL:2003 possui a cláusula opcional AND [ NO ] CHAIN que não é suportada pelo PostgreSQL atualmente. Fora isto, este comando está em conformidade com o padrão SQL.
[1] |
Oracle — O comando ROLLBACK é utilizado para desfazer o trabalho realizado na transação corrente, ou para desfazer manualmente o trabalho realizado por uma transação distribuída duvidosa. A palavra chave WORK é opcional, sendo fornecida por compatibilidade com o padrão SQL. A cláusula TO SAVEPOINT especifica o ponto de salvamento até o qual se deseja desfazer a transação corrente. Se esta cláusula for omitida, então o comando ROLLBACK desfazerá toda a transação. A utilização do comando ROLLBACK com a cláusula TO SAVEPOINT realiza as seguintes operações: Desfaz apenas a parte da transação após o ponto de salvamento; Apaga todos os pontos de salvamento criados após este ponto de salvamento (o nome do ponto de salvamento é retido, portanto pode-se desfazer até o mesmo ponto de salvamento várias vezes. Os pontos de salvamento anteriores também são retidos); Libera todos os bloqueios em tabelas e linhas obtidos desde o ponto de salvamento (As outras transações que solicitaram acesso às linhas bloqueadas após o ponto de salvamento deverão continuar aguardando até que a transação seja efetivada ou desfeita. As outras transações que ainda não solicitaram requisição para as linhas poderão requisitar e acessar as linhas imediatamente). Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.) |
[2] |
SQL Server — O comando ROLLBACK TRANSACTION desfaz uma transação explícita ou implícita até o início da transação, ou até um ponto de salvamento dentro da transação. O comando ROLLBACK TRANSACTION limpa todas as modificações nos dados realizadas a partir do início da transação ou a partir de um ponto de salvamento. Também libera os recursos mantidos pela transação. O comando ROLLBACK TRANSACTION sem nome do ponto de salvamento ou nome da transação desfaz até o início da transação. Quando se aninham transações, este comando desfaz todas as transações internas até o comando BEGIN TRANSACTION mais externo. Nos dois casos, o comando ROLLBACK TRANSACTION decrementa a função do sistema @@TRANCOUNT para 0. O comando ROLLBACK TRANSACTION até um ponto de salvamento não decrementa @@TRANCOUNT. O comando ROLLBACK TRANSACTION especificando um ponto de salvamento não libera nenhum bloqueio. SQL Server 2005 Books Online — ROLLBACK TRANSACTION (Transact-SQL) (N. do T.) |
[3] |
DB2 — O comando ROLLBACK é utilizado para desistir das alterações no banco de dados que foram feitas dentro da unidade de trabalho ou do ponto de salvamento. A cláusula TO SAVEPOINT especifica que deverá ser realizado um desfazimento parcial (ROLLBACK TO SAVEPOINT). Após o desfazimento bem-sucedido, o ponto de salvamento continuará a existir, mas todos os pontos de salvamento aninhados serão liberados e não existirão mais. Os pontos de salvamento aninhados, se existirem, serão considerados como se tivessem sido desfeitos e depois liberados como parte do desfazimento do ponto de salvamento corrente. Se não for fornecido o nome do ponto de salvamento, o desfazimento ocorrerá até o ponto de salvamento mais recente definido no nível de ponto de salvamento corrente. Se esta cláusula for omitida, o comando ROLLBACK desfazerá a transação inteiramente. Além disso, os pontos de salvamento dentro da transação serão liberados. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |