Sdílet prostřednictvím


VRÁCENÍ TRANSAKCE ZPĚT (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsPdW (Analytics Platform System)Sklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Tento příkaz vrátí zpět explicitní nebo implicitní transakci na začátek transakce nebo na bod uložení uvnitř transakce. Můžete použít ROLLBACK TRANSACTION k vymazání všech úprav dat provedených od začátku transakce nebo do bodu uložení. Uvolní také prostředky uchovávané transakcí.

Vrácení transakce zpět nezahrnuje změny provedené v místních proměnných nebo proměnných tabulky. Tyto změny nejsou tímto příkazem vymazány.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server, Azure SQL Database a databázi SQL Fabric.

ROLLBACK { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable
    | savepoint_name | @savepoint_variable ]
[ ; ]

Syntaxe datového skladu infrastruktury, Azure Synapse Analytics a paralelní databáze datového skladu

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Název přiřazený k transakci dne BEGIN TRANSACTION. transaction_name musí odpovídat pravidlům identifikátorů, ale používají se pouze prvních 32 znaků názvu transakce. Při vnoření transakcí, transaction_name musí být název z vnějšího BEGIN TRANSACTION příkazu. transaction_name se vždy rozlišují malá a velká písmena, i když instance SQL Serveru nerozlišuje malá a velká písmena.

@tran_name_variable

Název uživatelem definované proměnné obsahující platný název transakce. Proměnná musí být deklarována pomocí datového typu char, varchar, nchar nebo nvarchar .

savepoint_name

savepoint_name z SAVE TRANSACTION příkazu. savepoint_name musí odpovídat pravidlům identifikátorů. Použijte savepoint_name , pokud by podmíněné vrácení zpět mělo mít vliv pouze na část transakce.

@savepoint_variable

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 .

Zpracování chyb

Příkaz ROLLBACK TRANSACTION negeneruje uživateli žádné zprávy. Pokud jsou upozornění potřebná v uložených procedurách nebo triggerech, použijte příkazy RAISERROR nebo PRINT příkazy. RAISERROR je upřednostňovaným příkazem pro označení chyb.

Remarks

ROLLBACK TRANSACTION bez savepoint_name nebo transaction_name se vrátí zpět na začátek transakce. Když vnořujete transakce, tento stejný příkaz vrátí všechny vnitřní transakce do vnějšího BEGIN TRANSACTION příkazu. V obou případech ROLLBACK TRANSACTION dekrementuje systémovou @@TRANCOUNT funkci na 0. ROLLBACK TRANSACTION <savepoint_name> se nekrementuje @@TRANCOUNT.

ROLLBACK TRANSACTION nelze odkazovat na savepoint_name v distribuovaných transakcích, a to buď explicitně s BEGIN DISTRIBUTED TRANSACTION místní transakcí nebo eskalováno z místní transakce.

Transakci nelze vrátit zpět po COMMIT TRANSACTION provedení příkazu, s výjimkou případů, kdy COMMIT TRANSACTION je přidružena k vnořené transakci, která je obsažena v rámci transakce, která je vrácena zpět. V tomto případě se vnořená transakce vrátí zpět, i když jste pro ni vydali COMMIT TRANSACTION .

V rámci transakce jsou povoleny duplicitní názvy bodů uložení, ale ROLLBACK TRANSACTION použití duplicitního názvu savepointu se vrátí pouze k nejnovějšímu SAVE TRANSACTION názvu aplikace savepoint.

Interoperability

V uložených procedurách se ROLLBACK TRANSACTION příkazy bez savepoint_name nebo transaction_name vrátit zpět všechny příkazy na vnější BEGIN TRANSACTION. Příkaz ROLLBACK TRANSACTION v uložené proceduře, který způsobí @@TRANCOUNT , že má při dokončení uložené procedury jinou hodnotu, než @@TRANCOUNT je hodnota při volání uložené procedury, vytvoří informační zprávu. Tato zpráva nemá vliv na následné zpracování.

ROLLBACK TRANSACTION Pokud je aktivační událost vydána:

  • Všechny změny dat provedené v tomto bodu v aktuální transakci se vrátí zpět, včetně všech provedených triggerem.

  • Trigger pokračuje v provádění všech zbývajících příkazů za příkazem ROLLBACK . Pokud některý z těchto příkazů upraví data, změny se nevrátí zpět. Spuštěním těchto zbývajících příkazů se neaktivují žádné vnořené triggery.

  • Příkazy v dávce po příkazu, který aktivoval trigger, se nespustí.

@@TRANCOUNT se při zadávání triggeru zvýší o jeden, i když je v režimu automatického dokončování. (Systém považuje trigger za implicitní vnořenou transakci.)

ROLLBACK TRANSACTION příkazy v uložených procedurách nemají vliv na následné příkazy v dávce, která volala proceduru; následné příkazy v dávce se spustí. ROLLBACK TRANSACTION příkazy v triggerech ukončí dávku obsahující příkaz, který aktivoval aktivační událost; následné příkazy v dávce se nespustí.

ROLLBACK Účinek kurzoru je definován těmito třemi pravidly:

  • Při CURSOR_CLOSE_ON_COMMIT nastavení ONse zavře, ROLLBACK ale neodloží všechny otevřené kurzory.

  • U CURSOR_CLOSE_ON_COMMIT sady OFFROLLBACK nemá vliv na otevřené synchronní STATIC nebo INSENSITIVE kurzory ani asynchronní STATIC kurzory, které byly plně naplněny. Otevřené kurzory jakéhokoli jiného typu jsou zavřené, ale nejsou uvolněny.

  • Chyba, která ukončí dávku a vygeneruje interní zrušení vrácení zpět přidělení všech kurzorů, které byly deklarovány v dávce obsahující chybové prohlášení. Všechny kurzory jsou uvolněny bez ohledu na jejich typ nebo nastavení CURSOR_CLOSE_ON_COMMIT. To zahrnuje kurzory deklarované v uložených procedurách volaných dávkou chyb. Kurzory deklarované v dávce před dávkou chyby podléhají prvním dvěma pravidlům. Příkladem tohoto typu chyby je chyba zablokování. Příkaz ROLLBACK vydaný v triggeru také automaticky vygeneruje tento typ chyby.

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 eskalací a převodů. Tyto zámky se nevyvolají a nepřevedou se zpět na předchozí režim uzamčení.

Permissions

Vyžaduje členství ve veřejné roli .

Examples

Následující příklad ukazuje účinek vrácení pojmenované transakce zpět. Po vytvoření tabulky spustí následující příkazy pojmenovanou transakci, vloží dva řádky a pak vrátí transakci pojmenovanou v proměnné @TransactionName. Další příkaz mimo pojmenovanou transakci vloží dva řádky. Dotaz vrátí výsledky předchozích příkazů.

USE tempdb;
GO

CREATE TABLE ValueTable ([value] INT);
GO

DECLARE @TransactionName VARCHAR(20) = 'Transaction1';

BEGIN TRANSACTION @TransactionName

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (3), (4);

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

Tady je soubor výsledků.

value
-----
3
4