Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
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 wystąpienie aparatu bazy danych nie uwzględnia wielkości 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 są używane tylko pierwsze 32 znaki.
Remarks
Punkt zapisywania można ustawić w ramach transakcji. Punkt zapisywania definiuje stan spójności, do którego transakcja może zwrócić, 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 COMMIT TRANSACTION instrukcji lub musi zostać całkowicie anulowana przez wycofanie transakcji z powrotem na 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 ROLLBACK TRANSACTION instrukcja określająca nazwę punktu zapisywania powoduje wycofanie transakcji z powrotem do najnowszej SAVE TRANSACTION nazwy przy użyciu tej nazwy.
SAVE TRANSACTION nie jest obsługiwana w transakcjach rozproszonych uruchomionych jawnie BEGIN DISTRIBUTED TRANSACTION lub promowanych z transakcji lokalnych.
Uwaga / Notatka
Aparat bazy danych nie obsługuje niezależnie zarządzanych zagnieżdżonych transakcji. Zatwierdzenie wewnętrznego dekrementowania @@TRANCOUNT transakcji, ale nie ma innych efektów. Wycofanie transakcji wewnętrznej zawsze cofa zewnętrzną transakcję, chyba że istnieje punkt zapisywania i jest określony w instrukcji ROLLBACK .
Zachowanie blokujące
Instrukcja ROLLBACK TRANSACTION określająca savepoint_name zwalnia wszystkie blokady uzyskane poza punktem zapisywania, z wyjątkiem eskalowanych i przekonwertowanych blokad. Te blokady nie są zwalniane i nie są konwertowane z powrotem na poprzedni tryb blokady.
Permissions
Wymaga członkostwa w public roli.
Examples
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
W poniższym przykładzie pokazano, jak użyć punktu zapisywania transakcji, aby wycofać tylko modyfikacje wprowadzone przez procedurę składowaną, jeśli transakcja zostanie uruchomiona przed wykonaniem procedury składowanej.
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
Treści powiązane
- 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)
- Przewodnik dotyczący blokowania transakcji i wersjonowania wierszy