Share 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

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

Wijzigingen in lokale variabelen of tabelvariabelen worden niet gewist door deze instructie.

Transact-SQL syntaxis-conventies

Syntax

Syntaxis voor SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric.

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

Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric.

De naam die is toegewezen aan de transactie met BEGIN TRANSACTION. transaction_name moet voldoen aan de regels voor id's, maar alleen de eerste 32 tekens van de transactienaam worden gebruikt. Wanneer er interne transacties zijn, moet transaction_name de naam van de buitenste BEGIN TRANSACTION instructie zijn. transaction_name is altijd hoofdlettergevoelig, zelfs als het database-engine-exemplaar niet hoofdlettergevoelig is.

@tran_name_variable

Van toepassing op: SQL Server 2008 (10.0.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric.

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 terugdraaibewerking alleen van invloed mag zijn op het deel van de transactie na het opslagpunt.

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

Remarks

ROLLBACK TRANSACTION zonder een savepoint_name of transaction_name terugdraait naar het begin van de transactie. Wanneer er interne transacties zijn, worden met dezelfde 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 gepromoveerd 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 interne transactie die is opgenomen in de transactie die wordt teruggedraaid. In dit geval wordt de interne 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.

Opmerking

De database-engine biedt geen ondersteuning voor onafhankelijk beheerbare geneste transacties. Een doorvoer van een interne transactie wordt afgenomen @@TRANCOUNT , maar heeft geen andere effecten. Een terugdraaibewerking van een interne transactie rolt altijd de buitenste transactie terug, tenzij er een savepoint bestaat en wordt opgegeven in de ROLLBACK instructie.

Interoperability

In opgeslagen procedures wordt een ROLLBACK TRANSACTION instructie zonder savepoint_name of transaction_name alle instructies teruggedraaid naar de buitenste BEGIN TRANSACTION. Een ROLLBACK TRANSACTION instructie in een opgeslagen procedure die ervoor zorgt @@TRANCOUNT dat een andere waarde wordt gebruikt bij het voltooien van de procedure dan de waarde bij het begin van de procedure, produceert een informatief bericht. 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 interne transactie.

Een ROLLBACK TRANSACTION instructie in een opgeslagen procedure heeft geen invloed op volgende instructies in de batch die de procedure wordt genoemd. Volgende instructies in de batch worden uitgevoerd.

Een ROLLBACK TRANSACTION instructie in een trigger beëindigt de batch met de instructie die de trigger heeft geactiveerd. Volgende instructies in de batch worden niet uitgevoerd.

Het effect van een ROLLBACK op cursors wordt gedefinieerd door de volgende regels:

  • Als CURSOR_CLOSE_ON_COMMIT deze instelling is ONingesteld, wordt de toewijzing van alle geopende cursors niet ongedaan gemaakt, ROLLBACK maar wordt de toewijzing van alle geopende cursors niet ongedaan gemaakt.

  • Als CURSOR_CLOSE_ON_COMMIT deze instelling is ingesteld OFF, ROLLBACK heeft 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 de toewijzing van de transactie ongedaan maakt, worden alle cursors die zijn gedeclareerd in de batch met de instructie die de fout produceert, ongedaan gemaakt. 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 batch die de fout produceert. Cursors die in een batch zijn gedeclareerd voordat de batch die de fout produceert, onderhevig zijn aan de vorige twee regels.

    Een impasse is een voorbeeld van dit type fout. Een ROLLBACK verklaring die in een trigger wordt uitgegeven, resulteert ook in dit gedrag.

Vergrendelingsgedrag

Met ROLLBACK TRANSACTION een instructie die een savepoint_name geeft, worden eventuele vergrendelingen die buiten het opslagpunt worden verkregen, vrijgegeven, met uitzondering van geëscaleerde en geconverteerde vergrendelingen. Deze vergrendelingen worden niet vrijgegeven en worden niet teruggezet naar de vorige vergrendelingsmodus.

Permissions

Vereist lidmaatschap van de public 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;
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;

Hier is het resultatenoverzicht.

value
-----
3
4