Megosztás:


MENTÉS TRANZAKCIÓ (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Beállít egy mentési pontot egy tranzakción belül.

Transact-SQL szintaxis konvenciók

Syntax

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

Arguments

savepoint_name

A mentési ponthoz rendelt név. A Savepoint-neveknek meg kell felelniük az azonosítók szabályainak, de legfeljebb 32 karakter hosszúságúak. savepoint_name mindig megkülönbözteti a kis- és nagybetűk megkülönböztetése, még akkor is, ha az adatbázismotor-példány nem érzékeny a kis- és nagybetűkre.

@savepoint_variable

Egy felhasználó által definiált változó neve, amely érvényes savepoint-nevet tartalmaz. A változót karakter, varchar, nchar vagy nvarchar adattípussal kell deklarálni. Több mint 32 karakter adható át a változónak, de csak az első 32 karaktert használja a rendszer.

Remarks

Egy tranzakción belül beállíthatja a mentési pontokat. A savepoint konzisztenciát határoz meg, amelybe a tranzakció visszatérhet, ha a tranzakció egy részét feltételesen megszakítják. Ha egy tranzakciót visszahelyeznek egy mentési pontra, akkor szükség esetén több Transact-SQL utasítással és utasítással COMMIT TRANSACTION kell befejeződnie, vagy a tranzakció elejére történő visszagördítésével teljesen le kell mondania. Egy teljes tranzakció megszakításához használja az űrlapot ROLLBACK TRANSACTION transaction_name. A tranzakció összes utasítása vagy eljárása visszavonva.

A tranzakciókban engedélyezettek a duplikált mentési pontok nevei, de a ROLLBACK TRANSACTION savepoint nevét megadó utasítás csak az adott név használatával visszaállítja a tranzakciót a legutóbbira SAVE TRANSACTION .

SAVE TRANSACTION nem támogatott olyan elosztott tranzakciók esetén, amelyet kifejezetten egy helyi tranzakcióval BEGIN DISTRIBUTED TRANSACTION indítottak el vagy előléptetnek.

Megjegyzés:

Az adatbázismotor nem támogatja az egymástól függetlenül kezelhető beágyazott tranzakciókat. Belső tranzakciós decrements @@TRANCOUNT véglegesítés, de nincs más hatása. A belső tranzakciók visszaállítása mindig visszaállítja a külső tranzakciót, kivéve, ha létezik mentési pont , és az ROLLBACK utasításban meg van adva.

Zárolási viselkedés

A ROLLBACK TRANSACTIONsavepoint_name jelölő utasítás a savepointon kívül beszerzett összes zárolást felszabadítja, kivéve az eszkalált és konvertált zárolásokat. Ezek a zárolások nem szabadulnak fel, és nem lesznek visszaalakítva az előző zárolási módjukra.

Permissions

Tagságot igényel a public szerepkörben.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

Az alábbi példa bemutatja, hogyan használhatja a tranzakciós mentési pontokat a tárolt eljárás által végrehajtott módosítások visszaállítására, ha a tranzakció a tárolt eljárás végrehajtása előtt indul el.

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