Udostępnij za pośrednictwem


Zapisywanie transakcji (Transact-SQL)

Ustawia punkt zapisu w obrębie transakcji.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

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

Argumenty

  • savepoint_name
    To nazwa przypisana do punkt zapisu.Cofnięcie nazwy muszą być zgodne z zasadami identyfikatory, ale jest ograniczona do 32 znaków.

  • @savepoint_variable
    Jest nazwą zmiennej zdefiniowanej przez użytkownika zawierający nazwę prawidłowego punkt zapisu .Zmienna musi być zadeklarowana z char, varchar, nchar, lub nvarchar typu danych.Więcej niż 32 znaki mogą być przekazywane do zmiennej, ale będzie używany tylko pierwszych 32 znaków.

Uwagi

Użytkownik może zestaw punkt zapisulub znacznik w obrębie transakcji.punkt zapisu Określa lokalizację, do której transakcja można zwrócić część transakcji jest warunkowo anulowane.Jeśli transakcja jest przywracana do punkt zapisu, należy przejść do zakończenia z więcej Transact-SQL instrukcji, w razie potrzeby i PRZEKAZAĆ transakcji instrukcjalub muszą być całkowicie anulowane przez stopniowe transakcji powrót do początku.Aby anulować całej transakcji, za pomocą formularza transakcji ROLLBACK transaction_name.Instrukcje lub procedur transakcji zostaną cofnięte.

punkt zapisu zduplikowane nazwy są dozwolone w transakcji, ale TRANSAKCJĘ ROLLBACK instrukcja , która określa nazwę punkt zapisu tylko przywróci transakcji ostatniej transakcji ZAPISAĆ przy użyciu tej nazwy.

Zapisywanie transakcji nie jest obsługiwany w transakcji rozproszonych uruchomiona albo jawnie rozpoczęcie transakcji ROZPROSZONYCH lub przekazany z transakcji lokalnej.

Ważna informacjaWażne:

Po rozpoczęciu transakcji zasoby używane podczas transakcji są przechowywane aż do zakończenia transakcji (a mianowicie blokady).Jeśli częścią transakcji jest przywracana do punkt zapisu, zasobów nadal utrzymywane do czasu zakończenia transakcji lub wycofywanie transakcji pełną.

Uprawnienia

Wymaga członkostwa w public rolę.

Przykłady

Poniższy przykład pokazuje sposób używania transakcji punkt zapisu z wycofać tylko zmiany dokonane przez procedura składowana , jeśli aktywnej transakcji jest uruchamiany przed wykonaniem procedura składowana .

USE AdventureWorks2008R2;
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