Partilhar via


SALVAR TRANSAÇÃO (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase 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)