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. Slouží ROLLBACK TRANSACTION k vymazání všech úprav dat provedených od začátku transakce nebo z bodu uložení. ROLLBACK TRANSACTION uvolní také prostředky uchovávané transakcí.

Tímto příkazem se nesmazat změny místních proměnných nebo proměnných tabulky.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server, Azure SQL Database, Spravovanou instanci Azure SQL a databázi SQL v Microsoft 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

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance, DATABÁZE SQL v Microsoft Fabric.

Název přiřazený k transakci s BEGIN TRANSACTION. transaction_name musí odpovídat pravidlům identifikátorů, ale používají se pouze prvních 32 znaků názvu transakce. Pokud existují vnitřní transakce, transaction_name musí být název z vnějšího BEGIN TRANSACTION prohlášení. transaction_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.

@tran_name_variable

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance, DATABÁZE SQL v Microsoft Fabric.

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 vrácení zpět mělo mít vliv pouze na část transakce po uložení bodu uložení.

@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.

Remarks

ROLLBACK TRANSACTION bez savepoint_name nebo transaction_name se vrátí zpět na začátek transakce. Pokud existují vnitřní transakce, tento stejný příkaz vrátí zpě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 s povýšením z místní transakce.

Transakci nelze vrátit zpět po COMMIT TRANSACTION provedení příkazu, s výjimkou případu, kdy COMMIT TRANSACTION je přidružen k vnitřní transakci, která je obsažena v rámci transakce, která se vrací zpět. V tomto případě se vnitřní 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.

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.

Interoperability

V uložených procedurách se ROLLBACK TRANSACTION příkaz bez savepoint_name nebo transaction_name vrátí zpět všechny příkazy k nejkrajnější BEGIN TRANSACTION. Příkaz ROLLBACK TRANSACTION v uložené proceduře, který způsobí @@TRANCOUNT , že při dokončení procedury má jinou hodnotu než hodnota na začátku 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 zachází s triggerem jako s implicitní vnitřní transakcí.

Příkaz ROLLBACK TRANSACTION v uložené proceduře nemá vliv na následné příkazy v dávce, která volala proceduru. Následující příkazy v dávce se spustí.

Příkaz ROLLBACK TRANSACTION v triggeru ukončí dávku obsahující příkaz, který trigger aktivoval. Následující příkazy v dávce se nespustí.

ROLLBACK Účinek kurzoru je definován následujícími pravidly:

  • Při CURSOR_CLOSE_ON_COMMIT nastavení se ONzavře, ROLLBACK ale neudělí se všechny otevřené kurzory.

  • U CURSOR_CLOSE_ON_COMMIT nastavené ROLLBACKOFFhodnoty nemá vliv na otevřené synchronní STATIC kurzory ani INSENSITIVE asynchronní STATIC kurzory, které jsou plně vyplněné. Otevřené kurzory jakéhokoli jiného typu jsou zavřené, ale nejsou uvolněny.

  • Chyba, která ukončí dávku a vrátí zpět transakce uvolněné všechny kurzory, které byly deklarovány v dávce obsahující příkaz vytvářející chybu. 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 vytvářející chybu. Kurzory deklarované v dávce před dávkou, která vytváří chybu, podléhají předchozím dvěma pravidlům.

    Příkladem tohoto typu chyby je vzájemné zablokování. Výsledkem ROLLBACK tohoto chování je také příkaz vydaný v triggeru.

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

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;
CREATE TABLE ValueTable
(
    value INT
);

DECLARE @TransactionName AS 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