Udostępnij przez


ZAPISZ TRANSAKCJĘ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Ustawia punkt zapisywania w ramach transakcji.

Transact-SQL konwencje składni

Syntax

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

Arguments

savepoint_name

To nazwa przypisana do punktu zapisywania. Nazwy punktów zapisywania muszą być zgodne z regułami identyfikatorów, ale są ograniczone do 32 znaków. savepoint_name zawsze uwzględnia wielkość liter, nawet jeśli wystąpienie aparatu bazy danych nie uwzględnia wielkości liter.

@savepoint_variable

To nazwa zmiennej zdefiniowanej przez użytkownika zawierającej prawidłową nazwę punktu zapisywania. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar . Do zmiennej można przekazać więcej niż 32 znaki, ale są używane tylko pierwsze 32 znaki.

Remarks

Punkt zapisywania można ustawić w ramach transakcji. Punkt zapisywania definiuje stan spójności, do którego transakcja może zwrócić, jeśli część transakcji jest warunkowo anulowana. Jeśli transakcja zostanie wycofana do punktu zapisywania, musi przejść do ukończenia z bardziej Transact-SQL instrukcji w razie potrzeby i COMMIT TRANSACTION instrukcji lub musi zostać całkowicie anulowana przez wycofanie transakcji z powrotem na początku. Aby anulować całą transakcję, użyj formularza ROLLBACK TRANSACTION transaction_name. Wszystkie instrukcje lub procedury transakcji są cofnięte.

Zduplikowane nazwy punktów zapisywania są dozwolone w transakcji, ale ROLLBACK TRANSACTION instrukcja określająca nazwę punktu zapisywania powoduje wycofanie transakcji z powrotem do najnowszej SAVE TRANSACTION nazwy przy użyciu tej nazwy.

SAVE TRANSACTION nie jest obsługiwana w transakcjach rozproszonych uruchomionych jawnie BEGIN DISTRIBUTED TRANSACTION lub promowanych z transakcji lokalnych.

Uwaga / Notatka

Aparat bazy danych nie obsługuje niezależnie zarządzanych zagnieżdżonych transakcji. Zatwierdzenie wewnętrznego dekrementowania @@TRANCOUNT transakcji, ale nie ma innych efektów. Wycofanie transakcji wewnętrznej zawsze cofa zewnętrzną transakcję, chyba że istnieje punkt zapisywania i jest określony w instrukcji ROLLBACK .

Zachowanie blokujące

Instrukcja ROLLBACK TRANSACTION określająca savepoint_name zwalnia wszystkie blokady uzyskane poza punktem zapisywania, z wyjątkiem eskalowanych i przekonwertowanych blokad. Te blokady nie są zwalniane i nie są konwertowane z powrotem na poprzedni tryb blokady.

Permissions

Wymaga członkostwa w public roli.

Examples

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

W poniższym przykładzie pokazano, jak użyć punktu zapisywania transakcji, aby wycofać tylko modyfikacje wprowadzone przez procedurę składowaną, jeśli transakcja zostanie uruchomiona przed wykonaniem procedury składowanej.

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