O comando SAVEPOINT estabelece um novo ponto de salvamento na transação corrente.
O ponto de salvamento é uma marca especial dentro da transação que permite desfazer todos os comandos executados após o seu estabelecimento, restaurando o estado da transação ao que era quando o ponto de salvamento foi estabelecido. [1] [2] [3]
Para desfazer até o ponto de salvamento deve ser utilizado o comando ROLLBACK TO SAVEPOINT. Para destruir um ponto de salvamento, mantendo os efeitos dos comandos executados após este ter sido estabelecido, deve ser utilizado o comando RELEASE SAVEPOINT.
Os pontos de salvamento somente podem ser estabelecidos dentro de um bloco de transação. Podem haver vários pontos de salvamento definidos dentro de uma transação.
Para estabelecer um ponto de salvamento e, posteriormente, desfazer o efeito de todos os comandos executados após o seu estabelecimento:
BEGIN; CREATE TEMPORARY TABLE tabela1 (col1 int) ON COMMIT DROP; 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; COMMIT; col1 ------ 1 3 (2 linhas)
A transação acima inseriu os valores 1 e 3, mas não o 2.
Para estabelecer e, posteriormente, destruir um ponto de salvamento:
BEGIN; CREATE TEMPORARY TABLE tabela1 (col1 int) ON COMMIT DROP; INSERT INTO tabela1 VALUES (3); SAVEPOINT meu_ponto_de_salvamento; INSERT INTO tabela1 VALUES (4); RELEASE SAVEPOINT meu_ponto_de_salvamento; SELECT * FROM tabela1; COMMIT; col1 ------ 3 4 (2 linhas)
A transação acima inseriu tanto o 3 quanto o 4.
O padrão SQL requer que um ponto de salvamento seja destruído, automaticamente, quando é estabelecido um outro ponto d e salvamento com o mesmo nome. No PostgreSQL o ponto de salvamento é mantido, embora somente o mais recente seja utilizado ao se desfazer ou liberar; a liberação do ponto de salvamento mais recente torna o ponto de salvamento mais antigo acessível novamente para os comandos ROLLBACK TO SAVEPOINT e RELEASE SAVEPOINT. Fora isso, o comando SAVEPOINT está em conformidade total com o padrão SQL.
[1] |
Oracle — O comando SAVEPOINT é utilizado para identificar um ponto em uma transação até o qual será possível desfazer posteriormente. Os nomes dos pontos de salvamento devem ser distintos em uma determinada transação. Se for criado um segundo ponto de salvamento com o mesmo identificador utilizado antes, o ponto de salvamento mais antigo será apagado. Após ter sido criado um ponto de salvamento, pode-se continuar o processamento, efetivar o trabalho, desfazer toda a transação, ou desfazer até o ponto de salvamento. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.) |
[2] |
SQL Server — O comando SAVE TRANSACTION define um ponto de salvamento na transação. O usuário pode definir um ponto de salvamento, ou marcador, na transação. O ponto de salvamento define um local até onde a transação pode retornar se parte da transação for cancelada condicionalmente. Se a transação for desfeita até o ponto de salvamento, deverá prosseguir até terminar com mais comandos Transact-SQL se for necessário, e submeter o comando COMMIT TRANSACTION, ou deverá ser cancelada inteiramente desfazendo a transação até o início. Para cancelar toda a transação é utilizada a forma ROLLBACK TRANSACTION nome_da_transação. Todos os comandos ou procedimentos da transação são desfeitos. São permitidos nomes duplicados de pontos de salvamento em uma transação, mas o comando ROLLBACK TRANSACTION que especifica o nome do ponto de salvamento somente irá desfazer a transação até o SAVE TRANSACTION que utilizou o nome mais recentemente. O comando SAVE TRANSACTION não é suportado em transações distribuídas iniciadas explicitamente através do comando BEGIN DISTRIBUTED TRANSACTION ou escaladas a partir de uma transação local. SQL Server 2005 Books Online — SAVE TRANSACTION (Transact-SQL) (N. do T.) |
[3] |
DB2 — O comando SAVEPOINT é utilizado para definir um ponto de salvamento em uma transação. A omissão da cláusula UNIQUE especifica que o nome do ponto de salvamento pode ser reutilizado no nível de ponto de salvamento por outro ponto de salvamento. Se já existir um ponto de salvamento com o mesmo nome no mesmo nível de ponto de salvamento, o ponto de salvamento existente será destruído e um novo ponto de salvamento com o mesmo nome será criado no ponto corrente do processamento. O novo ponto de salvamento será considerado como sendo o último ponto de salvamento estabelecido pelo aplicativo. Deve ser observado que a destruição de um ponto de salvamento através da reutilização de seu nome por outro ponto de salvamento simplesmente destrói o ponto de salvamento, não liberando os pontos de salvamento estabelecidos após o ponto de salvamento destruído. Estes pontos de salvamento subseqüentes somente poderão ser liberados através do comando RELEASE SAVEPOINT, que libera o ponto de salvamento especificado e todos os pontos de salvamento estabelecidos após o ponto de salvamento especificado. Se a cláusula UNIQUE for especificada, o nome do ponto de salvamento somente poderá ser reutilizado após o ponto de salvamento existente com o mesmo nome ser liberado. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |