ROLLBACK to polecenie, które wycofuje wszystkie zmiany wykonane w obrębie bieżącej transakcji i przywraca bazę danych do stanu sprzed jej rozpoczęcia. Jeśli w trakcie operacji coś pójdzie nie tak — błąd aplikacji, naruszenie ograniczenia, zerwane połączenie albo zwykła zmiana zdania — ROLLBACK sprawia, że baza zachowuje się tak, jakby tych zmian nigdy nie było. To przeciwieństwo COMMIT, które zmiany zatwierdza na stałe.
Jak to działa
Transakcja to grupa operacji traktowana jako jedna całość — albo wykona się wszystko, albo nic. Dopóki nie wywołasz COMMIT, zmiany są tylko „tymczasowe” i widoczne głównie w obrębie Twojej sesji. ROLLBACK mówi silnikowi bazy: „zapomnij o wszystkim od BEGIN„. To jedna z gwarancji ACID — konkretnie atomowości (A) i spójności (C). Dzięki temu nie zostaniesz z bazą w połowicznym, niespójnym stanie, np. ze ściągniętą kasą z jednego konta, której nigdy nie dopisano na drugim.
Wiele baz pozwala też cofać zmiany częściowo dzięki SAVEPOINT. Tworzysz punkt kontrolny w środku transakcji i możesz wrócić tylko do niego (ROLLBACK TO savepoint), nie kasując wszystkiego od początku.
Przykład z praktyki
Klasyka — przelew w PostgreSQL albo MySQL:
BEGIN;UPDATE konta SET saldo = saldo - 500 WHERE id = 1;UPDATE konta SET saldo = saldo + 500 WHERE id = 2;
Jeśli drugi UPDATE się wywali (np. konto nie istnieje), wywołujesz ROLLBACK; i pierwsza zmiana również znika — nikt nie traci 500 zł w próżni. Dopiero gdy oba kroki przejdą, robisz COMMIT;. W kodzie aplikacji ten sam wzorzec realizujesz przez blok try/catch: w bloku obsługi wyjątku wołasz rollback, zamiast commitować.
Na co uważać
Kilka pułapek, które łapią juniorów:
- Autocommit. Domyślnie wiele klientów ma włączony tryb autocommit — każde zapytanie zatwierdza się natychmiast i nie ma już czego cofać. Najpierw otwórz transakcję (
BEGIN/ wyłącz autocommit). - DDL bywa niecofalny. W MySQL polecenia jak
CREATE TABLEczyDROP TABLEpowodują niejawny commit —ROLLBACKich nie odkręci. PostgreSQL akurat potrafi cofać większość DDL w transakcji. - To nie jest backup.
ROLLBACKratuje tylko niezatwierdzoną transakcję. PoCOMMITnic już nie cofniesz tym poleceniem — wtedy zostaje przywracanie z kopii.
Pojęcia powiązane: COMMIT, transakcja, ACID, SAVEPOINT, BEGIN/START TRANSACTION, autocommit, izolacja transakcji, deadlock.