Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Ustawia punkt zapisywania w ramach transakcji.
Transact-SQL konwencje składni
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
To nazwa przypisana do punktu zapisywania. Nazwy punktów zapisywania muszą być zgodne z regułami identyfikatorów, ale są ograniczone do 32 znaków.
savepoint_name zawsze uwzględnia wielkość liter, nawet jeśli w wystąpieniu programu SQL Server nie jest uwzględniana wielkość liter.
@
savepoint_variable
To nazwa zmiennej zdefiniowanej przez użytkownika zawierającej prawidłową nazwę punktu zapisywania. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar . Do zmiennej można przekazać więcej niż 32 znaki, ale będą używane tylko pierwsze 32 znaki.
Remarks
Użytkownik może ustawić punkt zapisu lub znacznik w ramach transakcji. Punkt zapisywania definiuje lokalizację, w której transakcja może być zwracana, jeśli część transakcji jest warunkowo anulowana. Jeśli transakcja zostanie wycofana do punktu zapisywania, musi przejść do ukończenia z bardziej Transact-SQL instrukcji w razie potrzeby i instrukcji COMMIT TRANSACTION lub musi zostać całkowicie anulowana przez wycofanie transakcji z powrotem do początku. Aby anulować całą transakcję, użyj formularza ROLLBACK TRANSACTION transaction_name. Wszystkie instrukcje lub procedury transakcji są cofnięte.
Zduplikowane nazwy punktów zapisywania są dozwolone w transakcji, ale instrukcja ROLLBACK TRANSACTION, która określa nazwę punktu zapisu, spowoduje wycofanie transakcji tylko do najnowszej TRANSAKCJI SAVE przy użyciu tej nazwy.
FUNKCJA SAVE TRANSACTION nie jest obsługiwana w transakcjach rozproszonych uruchomionych jawnie z funkcją BEGIN DISTRIBUTED TRANSACTION lub eskalowana z transakcji lokalnej.
Important
Instrukcja ROLLBACK TRANSACTION określająca savepoint_name zwalnia wszystkie blokady, które są uzyskiwane poza punktem zapisywania, z wyjątkiem eskalacji i konwersji. Te blokady nie są zwalniane i nie są konwertowane z powrotem na poprzedni tryb blokady.
Permissions
Wymaga członkostwa w roli publicznej.
Examples
W poniższym przykładzie pokazano, jak użyć punktu zapisywania transakcji, aby wycofać tylko modyfikacje wprowadzone przez procedurę składowaną, jeśli aktywna transakcja zostanie uruchomiona przed wykonaniem procedury składowanej.
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
Zobacz też
ROZPOCZNIJ TRANSAKCJĘ (Transact-SQL)
TRANSAKCJA COMMIT (Transact-SQL)
ZAANGAŻUJ PRACĘ (Transact-SQL)
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
BŁĄD_PROCEDURY (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
RAISERROR (Transact-SQL)
WYCOFYWANIA TRANSAKCJI (Transact-SQL)
WYCOFYWANIE PRACY (Transact-SQL)
TRY... CATCH (Transact-SQL)
XACT_STATE (Transact-SQL)