Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Hiermee stelt u een opslagpunt in een transactie in.
Transact-SQL syntaxis-conventies
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
Is de naam toegewezen aan het opslagpunt. Savepoint-namen moeten voldoen aan de regels voor id's, maar zijn beperkt tot 32 tekens. savepoint_name is altijd hoofdlettergevoelig, zelfs als het database-engine-exemplaar niet hoofdlettergevoelig is.
@savepoint_variable
Is de naam van een door de gebruiker gedefinieerde variabele die een geldige savepoint-naam bevat. De variabele moet worden gedeclareerd met een gegevenstype char, varchar, nchar of nvarchar . Er kunnen meer dan 32 tekens worden doorgegeven aan de variabele, maar alleen de eerste 32 tekens worden gebruikt.
Remarks
U kunt een savepoint instellen binnen een transactie. Het opslagpunt definieert een consistentiestatus waarmee een transactie kan worden geretourneerd als een deel van de transactie voorwaardelijk wordt geannuleerd. Als een transactie wordt teruggedraaid naar een opslagpunt, moet de transactie zo nodig worden voltooid met meer Transact-SQL instructies en een COMMIT TRANSACTION instructie, of moet deze helemaal worden geannuleerd door de transactie terug te draaien naar het begin. Als u een hele transactie wilt annuleren, gebruikt u het formulier ROLLBACK TRANSACTION transaction_name. Alle instructies of procedures van de transactie worden ongedaan gemaakt.
Dubbele savepoint-namen zijn toegestaan in een transactie, maar een ROLLBACK TRANSACTION instructie waarmee de savepoint-naam wordt opgegeven, wordt de transactie alleen teruggedraaid naar het meest recente SAVE TRANSACTION gebruik van die naam.
SAVE TRANSACTION wordt niet ondersteund in gedistribueerde transacties die expliciet zijn gestart met BEGIN DISTRIBUTED TRANSACTION of gepromoveerd vanuit een lokale transactie.
Opmerking
De database-engine biedt geen ondersteuning voor onafhankelijk beheerbare geneste transacties. Een doorvoer van een interne transactie wordt afgenomen @@TRANCOUNT , maar heeft geen andere effecten. Een terugdraaibewerking van een interne transactie rolt altijd de buitenste transactie terug, tenzij er een savepoint bestaat en wordt opgegeven in de ROLLBACK instructie.
Vergrendelingsgedrag
Met ROLLBACK TRANSACTION een instructie die een savepoint_name geeft, worden eventuele vergrendelingen die buiten het opslagpunt worden verkregen, vrijgegeven, met uitzondering van geëscaleerde en geconverteerde vergrendelingen. Deze vergrendelingen worden niet vrijgegeven en worden niet teruggezet naar de vorige vergrendelingsmodus.
Permissions
Vereist lidmaatschap van de public rol.
Examples
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
In het volgende voorbeeld ziet u hoe u een transactie-savepoint gebruikt om alleen de wijzigingen die zijn aangebracht door een opgeslagen procedure terug te draaien als een transactie wordt gestart voordat de opgeslagen procedure wordt uitgevoerd.
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
Verwante inhoud
- BEGIN TRANSACTIE (Transact-SQL)
- DOORVOERTRANSACTIE (Transact-SQL)
- DOORVOERWERK (Transact-SQL)
- ERROR_LINE (Transact-SQL)
- ERROR_MESSAGE (Transact-SQL)
- ERROR_NUMBER (Transact-SQL)
- FOUT_PROCÉDURE (Transact-SQL)
- ERROR_SEVERITY (Transact-SQL)
- FOUTTOESTAND (Transact-SQL)
- RAISERROR (Transact-SQL)
- TRANSACTIE voor terugdraaien (Transact-SQL)
- TERUGDRAAIEN VAN WERK (Transact-SQL)
- TRY... CATCH (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Handleiding voor transactievergrendeling en rijversiebeheer