Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Förhandsversion av Microsoft Fabric
Anger en sparandepunkt i en transaktion.
Transact-SQL syntaxkonventioner
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
Är namnet tilldelat till sparandepunkten. Savepoint-namn måste överensstämma med reglerna för identifierare, men är begränsade till 32 tecken.
savepoint_name är alltid skiftlägeskänslig, även om instansen av SQL Server inte är skiftlägeskänslig.
@
savepoint_variable
Är namnet på en användardefinierad variabel som innehåller ett giltigt savepoint-namn. Variabeln måste deklareras med datatypen char, varchar, nchar eller nvarchar . Mer än 32 tecken kan skickas till variabeln, men endast de första 32 tecknen används.
Remarks
En användare kan ange en sparande punkt eller markör i en transaktion. Savepoint definierar en plats som en transaktion kan returnera om en del av transaktionen avbryts villkorligt. Om en transaktion återställs till en sparpunkt måste den slutföras med fler Transact-SQL-instruktioner om det behövs och en COMMIT TRANSACTION-instruktion, eller så måste den avbrytas helt genom att transaktionen återställs till början. Om du vill avbryta en hel transaktion använder du formuläret ROLLBACK TRANSACTION transaction_name. Alla instruktioner eller procedurer för transaktionen ångras.
Dubbletter av savepoint-namn tillåts i en transaktion, men en ROLLBACK TRANSACTION-instruktion som anger savepoint-namnet återställer bara transaktionen till den senaste SAVE TRANSACTION med det namnet.
SAVE TRANSACTION stöds inte i distribuerade transaktioner som startats uttryckligen med BEGIN DISTRIBUTED TRANSACTION eller eskaleras från en lokal transaktion.
Important
En ROLLBACK TRANSACTION-instruktion som anger en savepoint_name frigör alla lås som hämtas utanför sparandepunkten, med undantag för eskaleringar och konverteringar. Dessa lås släpps inte och de konverteras inte tillbaka till sitt tidigare låsläge.
Permissions
Kräver medlemskap i den offentliga rollen.
Examples
I följande exempel visas hur du använder en transaktionssparpunkt för att återställa endast de ändringar som görs av en lagrad procedur om en aktiv transaktion startas innan den lagrade proceduren körs.
USE AdventureWorks2022;
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
See Also
STARTA TRANSAKTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT-ARBETE (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)
ÅTERSTÄLLNINGSTRANSAKTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
TRY...CATCH (Transact-SQL)
XACT_STATE (Transact-SQL)