Lekcja 20: Transakcje - COMMIT i ROLLBACK

Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

Lekcja 20: Transakcje - COMMIT i ROLLBACK
Required In Progress

Co to jest transakcja? (Zasada "wszystko albo nic")

Transakcja to logiczna jednostka pracy, która może składać się z jednej lub więcej operacji DML (np. INSERT, UPDATE, DELETE). Główną cechą transakcji jest atomowość (zasada "wszystko albo nic"). Oznacza to, że albo wszystkie operacje w ramach transakcji zostaną pomyślnie wykonane i trwale zapisane w bazie, albo — w przypadku błędu lub celowego wycofania — żadna z nich nie zostanie zapisana, a baza wróci do stanu sprzed rozpoczęcia transakcji.

Klasyczny przykład: przelew bankowy

Przelew pomiędzy kontami powinien być wykonany jako jedna atomowa transakcja — oba kroki muszą się powieść razem:

UPDATE Konta SET Saldo = Saldo - 100 WHERE ID_Konta = A;  -- Operacja 1: Zabierz pieniądze z konta A
UPDATE Konta SET Saldo = Saldo + 100 WHERE ID_Konta = B;  -- Operacja 2: Dodaj pieniądze na konto B

Jeśli Operacja 1 powiedzie się, a Operacja 2 nie (np. awaria), bez transakcji pieniądze mogłyby "zniknąć" z systemu. Transakcja gwarantuje, że w takim wypadku Operacja 1 zostanie automatycznie wycofana.

BEGIN TRANSACTION (lub domyślny start)

Wiele systemów bazodanowych domyślnie działa w trybie autocommit (automatycznego zatwierdzania), gdzie każde pojedyncze polecenie DML jest traktowane jako osobna, od razu zatwierdzona transakcja. Aby wykonać wiele poleceń jako jedną atomową jednostkę, należy jawnie rozpocząć transakcję, np. poleceniem BEGIN TRANSACTION (lub START TRANSACTION, zależnie od dialektu SQL).

COMMIT — zatwierdzenie zmian

Polecenie COMMIT (lub COMMIT TRANSACTION) kończy transakcję i trwale zapisuje wszystkie zmiany dokonane od rozpoczęcia transakcji. Po COMMIT zmiany są widoczne dla innych użytkowników i nie można ich już łatwo wycofać.

ROLLBACK — wycofanie zmian

Polecenie ROLLBACK (lub ROLLBACK TRANSACTION) kończy transakcję i anuluje wszystkie zmiany dokonane od jej rozpoczęcia. Baza danych wraca do stanu sprzed rozpoczęcia transakcji — to jest "przycisk Undo" dla operacji DML.

Dlaczego to jest krytycznie ważne przy UPDATE i DELETE?

Transakcje pełnią rolę siatki bezpieczeństwa przy ryzykownych operacjach DML. Przykładowy scenariusz:

  1. Napiszemy:
  2. Uruchamiamy potencjalnie błędne zapytanie:
  3. Baza zwraca: "Usunięto 5000 wierszy", a my uświadamiamy sobie, że chcieliśmy usunąć tylko uczniów z < 2.0.
  4. Zamiast panikować, ponieważ nie zatwierdziliśmy zmian, wykonujemy:
  5. Wszystkie 5000 wierszy zostają przywrócone — dane są bezpieczne. Dopiero po poprawieniu zapytania można zakończyć operację poleceniem COMMIT.

Taka praktyka (zaczynanie od BEGIN TRANSACTION, sprawdzanie wpływu zapytań i dopiero potem COMMIT) pomaga uniknąć katastrof przy masowych aktualizacjach i usuwaniu danych. Zagadnienia związane z DML i różnicą między operacjami usuwania a operacjami definicji danych (np. DELETE vs DROP TABLE) opisane są w materiałach kursu.