Dela via


ÅTERSTÄLLNINGSTRANSAKTION (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)Lager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Den här instruktionen återställer en explicit eller implicit transaktion till början av transaktionen eller till en savepoint i transaktionen. Du kan använda ROLLBACK TRANSACTION för att radera alla dataändringar som gjorts från början av transaktionen eller till en sparandepunkt. Det frigör också resurser som innehas av transaktionen.

När du återställer en transaktion ingår inte ändringar som gjorts i lokala variabler eller tabellvariabler. Dessa ändringar raderas inte av den här instruktionen.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server, Azure SQL Database och Fabric SQL Database.

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

Syntax för Fabric Data Warehouse, Azure Synapse Analytics och Parallel Data Warehouse Database.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Namnet som tilldelats transaktionen BEGIN TRANSACTIONpå . transaction_name måste följa reglerna för identifierare, men endast de första 32 tecknen i transaktionsnamnet används. När du kapslade transaktioner måste transaction_name vara namnet från den yttersta BEGIN TRANSACTION instruktionen. transaction_name är alltid skiftlägeskänslig, även om instansen av SQL Server inte är skiftlägeskänslig.

@tran_name_variable

Namnet på en användardefinierad variabel som innehåller ett giltigt transaktionsnamn. Variabeln måste deklareras med datatypen char, varchar, nchar eller nvarchar .

savepoint_name

savepoint_name från en SAVE TRANSACTION instruktion. savepoint_name måste följa reglerna för identifierare. Använd savepoint_name när en villkorlig återställning endast ska påverka en del av transaktionen.

@savepoint_variable

Namnet på en användardefinierad variabel som innehåller ett giltigt savepoint-namn. Variabeln måste deklareras med datatypen char, varchar, nchar eller nvarchar .

Felhantering

En ROLLBACK TRANSACTION instruktion genererar inga meddelanden till användaren. Om varningar behövs i lagrade procedurer eller utlösare använder du RAISERROR instruktionerna eller PRINT . RAISERROR är den föredragna instruktionen för att ange fel.

Remarks

ROLLBACK TRANSACTION utan savepoint_name eller transaction_name återställs till början av transaktionen. När du kapslar transaktioner återställer samma instruktion alla inre transaktioner till den yttersta BEGIN TRANSACTION instruktionen. I båda fallen ROLLBACK TRANSACTION minskar @@TRANCOUNT systemfunktionen till 0. ROLLBACK TRANSACTION <savepoint_name> minskar @@TRANCOUNTinte .

ROLLBACK TRANSACTION kan inte referera till en savepoint_name i distribuerade transaktioner som startats explicit med BEGIN DISTRIBUTED TRANSACTION eller eskalerats från en lokal transaktion.

En transaktion kan inte återställas när en COMMIT TRANSACTION instruktion har körts, förutom när COMMIT TRANSACTION är associerad med en kapslad transaktion som finns i transaktionen som återställs. I det här fallet återställs den kapslade transaktionen, även om du har utfärdat en COMMIT TRANSACTION för den.

I en transaktion tillåts duplicerade savepoint-namn, men ett ROLLBACK TRANSACTION med det duplicerade savepoint-namnet återställs endast till det senaste SAVE TRANSACTION med hjälp av det namnet på sparandepunkten.

Interoperability

I lagrade procedurer ROLLBACK TRANSACTION återställer instruktioner utan savepoint_name eller transaction_name tillbaka alla instruktioner till den yttersta BEGIN TRANSACTION. En ROLLBACK TRANSACTION instruktion i en lagrad procedur som orsakar @@TRANCOUNT ett annat värde när den lagrade proceduren slutförs än värdet när den @@TRANCOUNT lagrade proceduren anropades skapar ett informationsmeddelande. Det här meddelandet påverkar inte efterföljande bearbetning.

Om en ROLLBACK TRANSACTION utfärdas i en utlösare:

  • Alla dataändringar som görs till den punkten i den aktuella transaktionen återställs, inklusive alla som görs av utlösaren.

  • Utlösaren fortsätter att köra eventuella återstående instruktioner efter -instruktionen ROLLBACK . Om någon av dessa instruktioner ändrar data återställs inte ändringarna. Inga kapslade utlösare utlöses av körningen av dessa återstående instruktioner.

  • Instruktionerna i batchen efter instruktionen som utlöste utlösaren körs inte.

@@TRANCOUNT ökas med en när du anger en utlösare, även när du är i autocommit-läge. (Systemet behandlar en utlösare som en underförstådd kapslad transaktion.)

ROLLBACK TRANSACTION instruktioner i lagrade procedurer påverkar inte efterföljande instruktioner i batchen som kallade proceduren. efterföljande instruktioner i batchen körs. ROLLBACK TRANSACTION instruktioner i utlösare avslutar batchen som innehåller -instruktionen som utlöste utlösaren. efterföljande instruktioner i batchen körs inte.

Effekten av en ROLLBACK på markörer definieras av dessa tre regler:

  • Med CURSOR_CLOSE_ON_COMMIT set stänger ON, ROLLBACK men frigör inte alla öppna markörer.

  • Med CURSOR_CLOSE_ON_COMMIT set OFFROLLBACK påverkar inte några öppna synkrona STATIC markörer eller INSENSITIVE asynkrona STATIC markörer som har fyllts i helt. Öppna markörer av någon annan typ stängs men frigörs inte.

  • Ett fel som avslutar en batch och genererar en intern återställning frigör alla markörer som deklarerades i batchen som innehåller feluttryck. Alla markörer frigörs oavsett typ eller inställning för CURSOR_CLOSE_ON_COMMIT. Detta inkluderar markörer som deklarerats i lagrade procedurer som anropas av felbatchen. Markörer som deklareras i en batch innan felbatchen omfattas av de två första reglerna. Ett dödlägesfel är ett exempel på den här typen av fel. En ROLLBACK instruktion som utfärdas i en utlösare genererar också automatiskt den här typen av fel.

Låsningsbeteende

En ROLLBACK TRANSACTION instruktion som anger en savepoint_name frigör alla lås som hämtas utanför sparandepunkten, förutom eskaleringar och konverteringar. Dessa lås frigörs inte och de konverteras inte tillbaka till sitt tidigare låsläge.

Permissions

Kräver medlemskap i offentlig roll.

Examples

I följande exempel visas effekten av att återställa en namngiven transaktion. När du har skapat en tabell startar följande instruktioner en namngiven transaktion, infogar två rader och återställer sedan transaktionen med namnet i variabeln @TransactionName. En annan instruktion utanför den namngivna transaktionen infogar två rader. Frågan returnerar resultatet från föregående instruktioner.

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;

Här är resultatet.

value
-----
3
4