Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Define um ponto de salvamento dentro de uma transação.
Transact-SQL convenções de sintaxe
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
É o nome atribuído ao savepoint. Os nomes de pontos de salvamento devem estar em conformidade com as regras para identificadores, mas estão limitados a 32 caracteres.
savepoint_name sempre diferencia maiúsculas de minúsculas, mesmo quando a instância do SQL Server não diferencia maiúsculas de minúsculas.
@
savepoint_variable
É o nome de uma variável definida pelo usuário que contém um nome de savepoint válido. A variável deve ser declarada com um tipo de dados char, varchar, nchar ou nvarchar . Mais de 32 caracteres podem ser passados para a variável, mas apenas os primeiros 32 caracteres serão usados.
Remarks
Um usuário pode definir um ponto de salvamento, ou marcador, dentro de uma transação. O savepoint define um local para o qual uma transação pode retornar se parte da transação for cancelada condicionalmente. Se uma transação for revertida para um savepoint, ela deverá prosseguir para a conclusão com mais instruções Transact-SQL, se necessário, e uma declaração COMMIT TRANSACTION, ou deverá ser cancelada completamente revertendo a transação de volta ao seu início. Para cancelar uma transação inteira, use o formulário ROLLBACK TRANSACTION transaction_name. Todas as declarações ou procedimentos da transação são desfeitos.
Nomes de savepoint duplicados são permitidos em uma transação, mas uma instrução ROLLBACK TRANSACTION que especifica o nome do savepoint só reverterá a transação para a SAVE TRANSACTION mais recente usando esse nome.
SAVE TRANSACTION não é suportado em transações distribuídas iniciadas explicitamente com BEGIN DISTRIBUTED TRANSACTION ou escaladas a partir de uma transação local.
Important
Uma instrução de transação de reversão especificando um savepoint_name libera todos os bloqueios adquiridos além do ponto de salvamento, com exceção de escalonamentos e conversões. Esses bloqueios não são liberados e não são convertidos de volta para o modo de bloqueio anterior.
Permissions
Requer a participação na função pública.
Examples
O exemplo a seguir mostra como usar um savepoint de transação para reverter somente as modificações feitas por um procedimento armazenado se uma transação ativa for iniciada antes que o procedimento armazenado seja executado.
USE AdventureWorks2022;
GO
IF EXISTS (SELECT name FROM sys.objects
WHERE name = N'SaveTranExample')
DROP PROCEDURE SaveTranExample;
GO
CREATE PROCEDURE SaveTranExample
@InputCandidateID INT
AS
-- Detect whether the procedure was called
-- from an active transaction and save
-- that for later use.
-- In the procedure, @TranCounter = 0
-- means there was no active transaction
-- and the procedure started one.
-- @TranCounter > 0 means an active
-- transaction was started before the
-- procedure was called.
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
-- Procedure called when there is
-- an active transaction.
-- Create a savepoint to be able
-- to roll back only the work done
-- in the procedure if there is an
-- error.
SAVE TRANSACTION ProcedureSave;
ELSE
-- Procedure must start its own
-- transaction.
BEGIN TRANSACTION;
-- Modify database.
BEGIN TRY
DELETE HumanResources.JobCandidate
WHERE JobCandidateID = @InputCandidateID;
-- Get here if no errors; must commit
-- any transaction started in the
-- procedure, but not commit a transaction
-- started before the transaction was called.
IF @TranCounter = 0
-- @TranCounter = 0 means no transaction was
-- started before the procedure was called.
-- The procedure must commit the transaction
-- it started.
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- An error occurred; must determine
-- which type of rollback will roll
-- back only the work done in the
-- procedure.
IF @TranCounter = 0
-- Transaction started in procedure.
-- Roll back complete transaction.
ROLLBACK TRANSACTION;
ELSE
-- Transaction started before procedure
-- called, do not roll back modifications
-- made before the procedure was called.
IF XACT_STATE() <> -1
-- If the transaction is still valid, just
-- roll back to the savepoint set at the
-- start of the stored procedure.
ROLLBACK TRANSACTION ProcedureSave;
-- If the transaction is uncommitable, a
-- rollback to the savepoint is not allowed
-- because the savepoint rollback writes to
-- the log. Just return to the caller, which
-- should roll back the outer transaction.
-- After the appropriate rollback, echo error
-- information to the caller.
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE();
SELECT @ErrorSeverity = ERROR_SEVERITY();
SELECT @ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH
GO
Ver também
INICIAR TRANSAÇÃO (Transact-SQL)
TRANSAÇÃO COMMIT (Transact-SQL)
TRABALHO DE COMPROMISSO (Transact-SQL)
LINHA_ERRO (Transact-SQL)
MENSAGEM_DE_ERRO (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
PROCEDIMENTO_ERRO (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
RAISERROR (Transact-SQL)
TRANSAÇÃO DE REVERSÃO (Transact-SQL)
TRABALHO DE REVERSÃO (Transact-SQL)
TENTE... CAPTURAR (Transact-SQL)
XACT_STATE (Transact-SQL)