Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-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
Kapcsolódó tartalom
- TRANZAKCIÓ INDÍTÁSA (Transact-SQL)
- VÉGLEGESÍTÉSI TRANZAKCIÓ (Transact-SQL)
- VÉGLEGESÍTÉSI MUNKA (Transact-SQL)
- ERROR_LINE (Transact-SQL)
- ERROR_MESSAGE (Transact-SQL)
- ERROR_NUMBER (Transact-SQL)
- ERROR_PROCEDURE (Transact-SQL)
- ERROR_SEVERITY (Transact-SQL)
- ERROR_STATE (Transact-SQL)
- RAISERROR (Transact-SQL)
- VISSZAÁLLÍTÁSI TRANZAKCIÓ (Transact-SQL)
- VISSZAÁLLÍTÁSI MUNKA (Transact-SQL)
- TRY... CATCH (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Tranzakciózárolási és sorverziózás útmutató