Dela via


SPARA TRANSAKTION (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Förhandsversion av Microsoft Fabric

Anger en sparandepunkt i en transaktion.

Transact-SQL syntaxkonventioner

Syntax

SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }  
[ ; ]  

Arguments

savepoint_name
Är namnet tilldelat till sparandepunkten. Savepoint-namn måste överensstämma med reglerna för identifierare, men är begränsade till 32 tecken. savepoint_name är alltid skiftlägeskänslig, även om instansen av SQL Server inte är skiftlägeskänslig.

@ savepoint_variable
Är namnet på en användardefinierad variabel som innehåller ett giltigt savepoint-namn. Variabeln måste deklareras med datatypen char, varchar, nchar eller nvarchar . Mer än 32 tecken kan skickas till variabeln, men endast de första 32 tecknen används.

Remarks

En användare kan ange en sparande punkt eller markör i en transaktion. Savepoint definierar en plats som en transaktion kan returnera om en del av transaktionen avbryts villkorligt. Om en transaktion återställs till en sparpunkt måste den slutföras med fler Transact-SQL-instruktioner om det behövs och en COMMIT TRANSACTION-instruktion, eller så måste den avbrytas helt genom att transaktionen återställs till början. Om du vill avbryta en hel transaktion använder du formuläret ROLLBACK TRANSACTION transaction_name. Alla instruktioner eller procedurer för transaktionen ångras.

Dubbletter av savepoint-namn tillåts i en transaktion, men en ROLLBACK TRANSACTION-instruktion som anger savepoint-namnet återställer bara transaktionen till den senaste SAVE TRANSACTION med det namnet.

SAVE TRANSACTION stöds inte i distribuerade transaktioner som startats uttryckligen med BEGIN DISTRIBUTED TRANSACTION eller eskaleras från en lokal transaktion.

Important

En ROLLBACK TRANSACTION-instruktion som anger en savepoint_name frigör alla lås som hämtas utanför sparandepunkten, med undantag för eskaleringar och konverteringar. Dessa lås släpps inte och de konverteras inte tillbaka till sitt tidigare låsläge.

Permissions

Kräver medlemskap i den offentliga rollen.

Examples

I följande exempel visas hur du använder en transaktionssparpunkt för att återställa endast de ändringar som görs av en lagrad procedur om en aktiv transaktion startas innan den lagrade proceduren körs.

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  

See Also

STARTA TRANSAKTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT-ARBETE (Transact-SQL)
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
RAISERROR (Transact-SQL)
ÅTERSTÄLLNINGSTRANSAKTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
TRY...CATCH (Transact-SQL)
XACT_STATE (Transact-SQL)