SPARA TRANSAKTION (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i 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 databasmotorinstansen 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

Du kan ange en sparandepunkt i en transaktion. Savepoint definierar ett tillstånd av konsekvens som en transaktion kan returnera om en del av transaktionen avbryts villkorligt. Om en transaktion återställs till en sparandepunkt måste den fortsätta att 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 namnet på sparandepunkten återställer bara transaktionen till den senaste SAVE TRANSACTION med det namnet.

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

Anmärkning

Databasmotorn stöder inte oberoende hanterbara kapslade transaktioner. En incheckning av en inre transaktion minskar @@TRANCOUNT men har inga andra effekter. En återställning av en inre transaktion återställer alltid den yttre transaktionen, såvida inte en sparandepunkt finns och anges i -instruktionen ROLLBACK .

Låsningsbeteende

En ROLLBACK TRANSACTION instruktion som anger en savepoint_name frigör alla lås som hämtas utanför sparandepunkten, förutom eskalerade och konverterade lås. Dessa lås frigörs inte och de konverteras inte tillbaka till sitt tidigare låsläge.

Permissions

Kräver medlemskap i public rollen.

Examples

Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

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 transaktion startas innan den lagrade proceduren körs.

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, return 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