Delen via


TERUGDRAAITRANSACTIE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Met deze instructie wordt een expliciete of impliciete transactie teruggedraaid naar het begin van de transactie of naar een opslagpunt binnen de transactie. U kunt ROLLBACK TRANSACTION alle gegevenswijzigingen wissen die zijn aangebracht vanaf het begin van de transactie of naar een opslagpunt. Er worden ook resources vrijgemaakt die door de transactie worden bewaard.

Het terugdraaien van een transactie bevat geen wijzigingen die zijn aangebracht in lokale variabelen of tabelvariabelen. Deze wijzigingen worden niet gewist door deze instructie.

Transact-SQL syntaxis-conventies

Syntax

Syntaxis voor SQL Server, Azure SQL Database en Fabric SQL-database.

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

Syntaxis voor Fabric Data Warehouse, Azure Synapse Analytics en parallelle datawarehouse-database.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

De naam die is toegewezen aan de transactie op BEGIN TRANSACTION. transaction_name moet voldoen aan de regels voor id's, maar alleen de eerste 32 tekens van de transactienaam worden gebruikt. Wanneer u transacties nest, moet transaction_name de naam zijn van de buitenste BEGIN TRANSACTION instructie. transaction_name is altijd hoofdlettergevoelig, zelfs als het exemplaar van SQL Server niet hoofdlettergevoelig is.

@tran_name_variable

De naam van een door de gebruiker gedefinieerde variabele met een geldige transactienaam. De variabele moet worden gedeclareerd met een gegevenstype char, varchar, nchar of nvarchar .

savepoint_name

savepoint_name uit een SAVE TRANSACTION instructie. savepoint_name moet voldoen aan de regels voor id's. Gebruik savepoint_name wanneer een voorwaardelijke terugdraaiactie alleen van invloed moet zijn op een deel van de transactie.

@savepoint_variable

De naam van een door de gebruiker gedefinieerde variabele met een geldige savepoint-naam. De variabele moet worden gedeclareerd met een gegevenstype char, varchar, nchar of nvarchar .

Foutafhandeling

Een ROLLBACK TRANSACTION instructie produceert geen berichten voor de gebruiker. Als er waarschuwingen nodig zijn in opgeslagen procedures of triggers, gebruikt u de RAISERROR of PRINT instructies. RAISERROR is de voorkeursinstructie voor het aangeven van fouten.

Remarks

ROLLBACK TRANSACTION zonder een savepoint_name of transaction_name terugdraait naar het begin van de transactie. Wanneer u transacties nest, worden met deze instructie alle binnenste transacties teruggedraaid naar de buitenste BEGIN TRANSACTION instructie. In beide gevallen ROLLBACK TRANSACTION wordt de @@TRANCOUNT systeemfunctie afgemaakt op 0. ROLLBACK TRANSACTION <savepoint_name> degradatie @@TRANCOUNTniet.

ROLLBACK TRANSACTION kan niet verwijzen naar een savepoint_name in gedistribueerde transacties die expliciet zijn gestart met BEGIN DISTRIBUTED TRANSACTION of geëscaleerd vanuit een lokale transactie.

Een transactie kan niet worden teruggedraaid nadat een COMMIT TRANSACTION instructie is uitgevoerd, behalve wanneer de COMMIT TRANSACTION transactie is gekoppeld aan een geneste transactie die is opgenomen in de transactie die wordt teruggedraaid. In dit geval wordt de geneste transactie teruggedraaid, zelfs als u er een COMMIT TRANSACTION voor hebt uitgegeven.

Binnen een transactie zijn dubbele savepoint-namen toegestaan, maar een ROLLBACK TRANSACTION met behulp van de dubbele savepoint-naam wordt alleen teruggedraaid naar de meest recente SAVE TRANSACTION met die savepoint-naam.

Interoperability

In opgeslagen procedures worden ROLLBACK TRANSACTION instructies zonder savepoint_name of transaction_name alle instructies teruggedraaid naar de buitenste BEGIN TRANSACTION. Een ROLLBACK TRANSACTION instructie in een opgeslagen procedure die een andere waarde veroorzaakt @@TRANCOUNT wanneer de opgeslagen procedure is voltooid dan de @@TRANCOUNT waarde toen de opgeslagen procedure werd aangeroepen, een informatief bericht produceert. Dit bericht heeft geen invloed op de volgende verwerking.

Als er een ROLLBACK TRANSACTION wordt uitgegeven in een trigger:

  • Alle gegevenswijzigingen die op dat punt in de huidige transactie zijn aangebracht, worden teruggedraaid, inclusief wijzigingen die door de trigger zijn aangebracht.

  • De trigger gaat verder met het uitvoeren van eventuele resterende instructies na de ROLLBACK instructie. Als een van deze instructies gegevens wijzigt, worden de wijzigingen niet teruggedraaid. Er worden geen geneste triggers geactiveerd door de uitvoering van deze resterende instructies.

  • De instructies in de batch na de instructie die de trigger heeft geactiveerd, worden niet uitgevoerd.

@@TRANCOUNT wordt met één verhoogd bij het invoeren van een trigger, zelfs wanneer deze zich in de autocommit-modus bevindt. (Het systeem behandelt een trigger als een impliciete geneste transactie.)

ROLLBACK TRANSACTION instructies in opgeslagen procedures zijn niet van invloed op volgende instructies in de batch die de procedure wordt genoemd; volgende instructies in de batch worden uitgevoerd. ROLLBACK TRANSACTION instructies in triggers beëindigen de batch met de instructie die de trigger heeft geactiveerd; volgende instructies in de batch worden niet uitgevoerd.

Het effect van een ROLLBACK cursor op cursors wordt gedefinieerd door deze drie regels:

  • Als CURSOR_CLOSE_ON_COMMIT de set is ingesteld ON, ROLLBACK wordt de toewijzing van alle geopende cursors niet ongedaan gemaakt.

  • Met CURSOR_CLOSE_ON_COMMIT set OFFheeft ROLLBACK dit geen invloed op geopende synchrone STATIC cursors of INSENSITIVE asynchrone STATIC cursors die volledig zijn gevuld. Open cursors van een ander type worden gesloten, maar de toewijzing ervan is niet ongedaan gemaakt.

  • Een fout die een batch beëindigt en een interne terugdraaiactie genereert, maakt de toewijzing ongedaan van alle cursors die zijn gedeclareerd in de batch met de foutinstructie. Alle cursors worden de toewijzing ongedaan gemaakt, ongeacht het type of de instelling van CURSOR_CLOSE_ON_COMMIT. Dit omvat cursors die zijn gedeclareerd in opgeslagen procedures die worden aangeroepen door de foutbatch. Cursors die in een batch zijn gedeclareerd voordat de foutbatch onderhevig is aan de eerste twee regels. Een impassefout is een voorbeeld van dit type fout. Een ROLLBACK verklaring die in een trigger is uitgegeven, genereert ook automatisch dit type fout.

Vergrendelingsgedrag

Met ROLLBACK TRANSACTION een instructie die een savepoint_name geeft, worden eventuele vergrendelingen die buiten het savepoint worden verkregen, vrijgegeven, met uitzondering van escalaties en conversies. Deze vergrendelingen worden niet vrijgegeven en worden niet teruggezet naar de vorige vergrendelingsmodus.

Permissions

Vereist lidmaatschap van de openbare rol.

Examples

In het volgende voorbeeld ziet u het effect van het terugdraaien van een benoemde transactie. Nadat u een tabel hebt gemaakt, beginnen de volgende instructies met een benoemde transactie, voegt u twee rijen in en rolt u vervolgens de transactie terug met de naam in de variabele @TransactionName. Met een andere instructie buiten de benoemde transactie worden twee rijen ingevoegd. De query retourneert de resultaten van de vorige instructies.

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;

Hier is het resultatenoverzicht.

value
-----
3
4