Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de 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 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
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 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_COMMITde set is ingesteldON,ROLLBACKwordt de toewijzing van alle geopende cursors niet ongedaan gemaakt.Met
CURSOR_CLOSE_ON_COMMITsetOFFheeftROLLBACKdit 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 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. EenROLLBACKverklaring 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