Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Ta instrukcja powoduje wycofanie jawnej lub niejawnej transakcji na początku transakcji lub do punktu zapisu wewnątrz transakcji.
ROLLBACK TRANSACTION Służy do wymazywania wszystkich modyfikacji danych dokonanych od początku transakcji lub z punktu zapisywania.
ROLLBACK TRANSACTION zwalnia również zasoby przechowywane przez transakcję.
Zmiany wprowadzone w zmiennych lokalnych lub zmiennych tabeli nie są usuwane przez tę instrukcję.
Transact-SQL konwencje składni
Syntax
Składnia dla programu SQL Server, usługi Azure SQL Database, usługi Azure SQL Managed Instance, bazy danych SQL w usłudze Microsoft Fabric.
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Składnia magazynu danych sieci szkieletowej, usługi Azure Synapse Analytics i równoległej bazy danych magazynu danych.
ROLLBACK { TRAN | TRANSACTION }
[ ; ]
Arguments
transaction_name
Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze Microsoft Fabric.
Nazwa przypisana do transakcji za pomocą BEGIN TRANSACTIONpolecenia .
transaction_name muszą być zgodne z regułami identyfikatorów, ale są używane tylko 32 pierwsze znaki nazwy transakcji. Jeśli istnieją transakcje wewnętrzne, transaction_name musi być nazwą z najbardziej zewnętrznej BEGIN TRANSACTION instrukcji.
transaction_name zawsze uwzględnia wielkość liter, nawet jeśli wystąpienie aparatu bazy danych nie uwzględnia wielkości liter.
@tran_name_variable
Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze Microsoft Fabric.
Nazwa zmiennej zdefiniowanej przez użytkownika zawierająca prawidłową nazwę transakcji. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar .
savepoint_name
savepoint_name z instrukcji SAVE TRANSACTION .
savepoint_name muszą być zgodne z regułami dotyczącymi identyfikatorów. Użyj savepoint_name , gdy wycofanie powinno mieć wpływ tylko na część transakcji po punkcie zapisywania.
@savepoint_variable
Nazwa zmiennej zdefiniowanej przez użytkownika zawierającej prawidłową nazwę punktu zapisywania. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar .
Obsługa błędów
Instrukcja ROLLBACK TRANSACTION nie generuje żadnych komunikatów dla użytkownika. Jeśli w procedurach składowanych lub wyzwalaczach są wymagane ostrzeżenia, użyj RAISERROR instrukcji or PRINT .
Remarks
ROLLBACK TRANSACTION bez savepoint_name lub transaction_name wraca do początku transakcji. Jeśli istnieją transakcje wewnętrzne, ta sama instrukcja przywraca wszystkie transakcje wewnętrzne do najbardziej zewnętrznej BEGIN TRANSACTION instrukcji. W obu przypadkach ROLLBACK TRANSACTION dekrementuje funkcję systemową @@TRANCOUNT do 0.
ROLLBACK TRANSACTION savepoint_name nie powoduje dekrementacji @@TRANCOUNT.
ROLLBACK TRANSACTION nie może odwoływać się do savepoint_name w transakcjach rozproszonych uruchomionych jawnie BEGIN DISTRIBUTED TRANSACTION lub promowanych z transakcji lokalnej.
Nie można wycofać transakcji po wykonaniu COMMIT TRANSACTION instrukcji, z wyjątkiem sytuacji, gdy COMMIT TRANSACTION jest skojarzona z transakcją wewnętrzną zawartą w transakcji, która jest wycofana. W tym przypadku transakcja wewnętrzna jest cofana, nawet jeśli została ona wystawiona COMMIT TRANSACTION .
W ramach transakcji zduplikowane nazwy punktów zapisywania są dozwolone, ale ROLLBACK TRANSACTION użycie zduplikowane nazwy punktu zapisywania jest przywracane tylko do najnowszej SAVE TRANSACTION przy użyciu tej nazwy punktu zapisywania.
Uwaga / Notatka
Aparat bazy danych nie obsługuje niezależnie zarządzanych zagnieżdżonych transakcji. Zatwierdzenie wewnętrznego dekrementowania @@TRANCOUNT transakcji, ale nie ma innych efektów. Wycofanie transakcji wewnętrznej zawsze cofa zewnętrzną transakcję, chyba że istnieje punkt zapisywania i jest określony w instrukcji ROLLBACK .
Interoperability
W procedurach ROLLBACK TRANSACTION składowanych instrukcja bez savepoint_name lub transaction_name przywraca wszystkie instrukcje do najbardziej zewnętrznego BEGIN TRANSACTION. Instrukcja ROLLBACK TRANSACTION w procedurze składowanej, która powoduje @@TRANCOUNT , że po zakończeniu procedury ma inną wartość niż wartość na początku procedury powoduje wygenerowanie komunikatu informacyjnego. Ten komunikat nie ma wpływu na kolejne przetwarzanie.
Jeśli element ROLLBACK TRANSACTION jest wystawiany w wyzwalaczu:
Wszystkie modyfikacje danych wprowadzone w tym punkcie w bieżącej transakcji zostaną wycofane, w tym wszelkie wprowadzone przez wyzwalacz.
Wyzwalacz kontynuuje wykonywanie pozostałych instrukcji po instrukcji
ROLLBACK. Jeśli którakolwiek z tych instrukcji modyfikuje dane, modyfikacje nie są wycofane. Żadne zagnieżdżone wyzwalacze nie są wyzwalane przez wykonanie tych pozostałych instrukcji.Instrukcje w partii po instrukcji, która wyzwoliła wyzwalacz, nie są wykonywane.
@@TRANCOUNT parametr jest zwiększany o jeden podczas wprowadzania wyzwalacza, nawet w trybie automatycznego zatwierdzenia. System traktuje wyzwalacz jako domniemaną transakcję wewnętrzną.
Instrukcja ROLLBACK TRANSACTION w procedurze składowanej nie ma wpływu na kolejne instrukcje w partii, która nazwała procedurę. Kolejne instrukcje w partii są wykonywane.
Instrukcja ROLLBACK TRANSACTION w wyzwalaczu kończy partię zawierającą instrukcję, która wyzwoliła wyzwalacz. Kolejne instrukcje w partii nie są wykonywane.
Efekt ROLLBACK kursorów jest definiowany przez następujące reguły:
W
CURSOR_CLOSE_ON_COMMITustawieniu naON,ROLLBACKzamyka, ale nie cofa przydziału wszystkich otwartych kursorów.W
CURSOR_CLOSE_ON_COMMITprzypadku ustawienia naOFFwartość nieROLLBACKma wpływu na otwarte synchroniczneSTATIClubINSENSITIVEkursory ani kursory asynchroniczneSTATIC, które są w pełni wypełnione. Otwarte kursory dowolnego innego typu są zamknięte, ale nie cofnięto przydziału.Błąd, który kończy partię i cofa cofnięcie przydziału transakcji powoduje cofnięcie przydziału wszystkich kursorów zadeklarowanych w partii zawierającej instrukcję generującą błąd. Wszystkie kursory są cofane niezależnie od typu lub ustawienia .
CURSOR_CLOSE_ON_COMMITObejmuje to kursory zadeklarowane w procedurach składowanych wywoływanych przez partię generującą błąd. Kursory zadeklarowane w partii przed utworzeniem partii błędu podlegają poprzednim dwóm regułom.Zakleszczenie jest przykładem tego typu błędu. Instrukcja
ROLLBACKwystawiona w wyzwalaczu powoduje również takie zachowanie.
Zachowanie blokujące
Instrukcja ROLLBACK TRANSACTION określająca savepoint_name zwalnia wszystkie blokady uzyskane poza punktem zapisywania, z wyjątkiem eskalowanych i przekonwertowanych blokad. Te blokady nie są zwalniane i nie są konwertowane z powrotem na poprzedni tryb blokady.
Permissions
Wymaga członkostwa w public roli.
Examples
W poniższym przykładzie pokazano efekt wycofywania nazwanej transakcji. Po utworzeniu tabeli następujące instrukcje rozpoczynają nazwaną transakcję, wstaw dwa wiersze, a następnie wycofają transakcję o nazwie w zmiennej @TransactionName. Inna instrukcja poza nazwaną transakcją wstawia dwa wiersze. Zapytanie zwraca wyniki poprzednich instrukcji.
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;
Oto zestaw wyników.
value
-----
3
4