Udostępnij za pośrednictwem


SAVE TRANSACTION (języka Transact-SQL)

Ustawia punkt bezpieczny w obrębie transakcji.

Topic link iconKonwencje składni języka Transact-SQL

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

Argumenty

  • savepoint_name
    Jest nazwa przypisana do punkt bezpieczny.Nazwy punkt bezpieczny muszą być zgodne z zasadami dla identyfikatorów, ale jest ograniczona do 32 znaków.

  • **@**savepoint_variable
    Czy nazwę zmiennej użytkownika zawierające nazwę prawidłowego punkt bezpieczny.Zmienna musi być zadeklarowana z char, varchar, nchar, lub nvarchar Typ danych. Więcej niż 32 znaki mogą być przekazywane do zmiennej, ale będzie można używać tylko pierwszych 32 znaków.

Remarks

Użytkownik może ustawić punkt bezpieczny lub znacznik w obrębie transakcji.punkt bezpieczny Określa lokalizację, do której transakcja może zwracać jeśli częścią transakcji warunkowo zostało anulowane.Jeśli transakcja jest przywracana do punkt bezpieczny, należy przejść do zakończenia z więcej Transact-SQL instrukcje w razie potrzeby i instrukcja zatwierdzanie TRANSACTION lub należy całkowicie anulować przez wycofywanie transakcji do początku. Aby anulować cała transakcja, należy użyć formularza ROLLBACK TRANSACTION transaction_name. Cofnięciem instrukcji lub procedury transakcji.

Nazwy punkt bezpieczny duplikaty są dozwolone w transakcji, ale instrukcja ROLLBACK TRANSACTION, która określa nazwę punkt bezpieczny będzie tylko wycofanie transakcji do ostatniej transakcji SAVE korzysta z tej nazwy.

SAVE TRANSACTION nie jest obsługiwany w transakcjach rozproszonych uruchomiona albo jawnie BEGIN transakcja rozproszona lub przekazany z transakcji lokalnej.

Important noteImportant Note:

Po rozpoczęciu transakcji, zasoby używane podczas transakcji są przechowywane aż do zakończenia transakcji (to znaczy, blokady).Jeśli częścią transakcji jest przywracana do punkt bezpieczny, zasobów nadal być zatrzymane do czasu zakończenia transakcji lub wycofywania transakcji pełne.

Uprawnienia

Członkostwo w grupie wymaga publiczne roli.

Przykłady

W poniższym przykładzie pokazano, jak używać punkt bezpieczny transakcji w celu wycofania zmiany dokonane przez procedura przechowywana, jeśli jest aktywna transakcja została uruchomiona przed wykonaniem procedura przechowywana.

USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.objects
           WHERE name = N'SaveTranExample')
    DROP PROCEDURE SaveTranExample;
GO
CREATE PROCEDURE SaveTranExample
    @InputCandidateID INT
AS
    -- Detect if 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