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
Spravovaná instance
Azure SQLAzure Synapse Analytics
PdW (Analytics Platform System)
Sklad v Microsoft Fabric
Databá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.
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_COMMITnastaveníONse zavře,ROLLBACKale neodloží všechny otevřené kurzory.U
CURSOR_CLOSE_ON_COMMITsadyOFFROLLBACKnemá vliv na otevřené synchronníSTATICneboINSENSITIVEkurzory ani asynchronníSTATICkurzory, 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říkazROLLBACKvydaný 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
Související obsah
- BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
- ZAČÁTEK TRANSAKCE (Transact-SQL)
- transakce potvrzení (Transact-SQL)
- ZAVÁZEJ PRÁCI (Transact-SQL)
- PRÁCE NA NÁVRATU ZPĚT (Transact-SQL)
- ULOŽIT TRANSAKCI (Transact-SQL)