Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Magazijn in Microsoft Fabric
SQL-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
ROLLBACKinstructie. 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_COMMITdeze instelling isONingesteld, wordt de toewijzing van alle geopende cursors niet ongedaan gemaakt,ROLLBACKmaar wordt de toewijzing van alle geopende cursors niet ongedaan gemaakt.Als
CURSOR_CLOSE_ON_COMMITdeze instelling is ingesteldOFF,ROLLBACKheeft dit geen invloed op geopende synchroneSTATICcursors ofINSENSITIVEasynchroneSTATICcursors 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
ROLLBACKverklaring 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