Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Nastaví bod uložení v rámci transakce.
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
Je název přiřazený k šetřovacímu bodu. Názvy bodů uložení musí odpovídat pravidlům identifikátorů, ale jsou omezeny na 32 znaků. savepoint_name se vždy rozlišují malá a velká písmena, i když instance databázového stroje nerozlišuje malá a velká písmena.
@savepoint_variable
Je název uživatelem definované proměnné obsahující platný název bodu uložení. Proměnná musí být deklarována pomocí datového typu char, varchar, nchar nebo nvarchar . Proměnné lze předat více než 32 znaků, ale používají se pouze prvních 32 znaků.
Remarks
V rámci transakce můžete nastavit bod uložení. Savepoint definuje stav konzistence, do kterého může transakce vrátit, pokud je část transakce podmíněně zrušena. Pokud je transakce vrácena zpět do savepoint, musí pokračovat dokončení s více Transact-SQL příkazy v případě potřeby a COMMIT TRANSACTION příkaz, nebo musí být zrušen zcela vrácením transakce zpět na jeho začátek. Chcete-li zrušit celou transakci, použijte formulář ROLLBACK TRANSACTION transaction_name. Všechny příkazy nebo procedury transakce jsou vráceny zpět.
Duplicitní názvy bodů uložení jsou povoleny v transakci, ale ROLLBACK TRANSACTION příkaz, který určuje název savepointu, vrátí transakce zpět do nejnovějšího SAVE TRANSACTION používajícího tento název.
SAVE TRANSACTION není podporována v distribuovaných transakcích, která byla spuštěna explicitně s BEGIN DISTRIBUTED TRANSACTION místní transakcí nebo povýšena z místní transakce.
Poznámka:
Databázový stroj nepodporuje nezávisle spravovatelné vnořené transakce. Potvrzení vnitřní transakce dekrementuje @@TRANCOUNT , ale nemá žádné jiné účinky. Vrácení zpět vnitřní transakce vždy vrátí zpět vnější transakce, pokud neexistuje savepoint a je zadán v ROLLBACK příkazu.
Chování při uzamčení
Příkaz ROLLBACK TRANSACTION určující savepoint_name uvolní všechny zámky, které jsou získány nad rámec savepointu, s výjimkou eskalovaných a převedených zámků. Tyto zámky se nevyvolají a nepřevedou se zpět na předchozí režim uzamčení.
Permissions
Vyžaduje členství v public roli.
Examples
Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .
Následující příklad ukazuje, jak použít savepoint transakce vrátit zpět pouze změny provedené uloženou procedurou, pokud transakce je spuštěna před spuštěním uložené procedury.
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
Související obsah
- ZAČÁTEK TRANSAKCE (Transact-SQL)
- transakce potvrzení (Transact-SQL)
- ZAVÁZEJ PRÁCI (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)
- transakce vrácení zpět (Transact-SQL)
- PRÁCE NA NÁVRATU ZPĚT (Transact-SQL)
- VYZKOUŠET... ZACHYTIT (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Průvodce uzamčením transakcí a verzováním řádků