TCL

Polecenia sterujące transakcjami: COMMIT, ROLLBACK i SAVEPOINT. Decydują o zatwierdzeniu lub wycofaniu zmian.

TCL (Transaction Control Language) to grupa poleceń SQL, którymi sterujesz transakcjami w bazie danych — czyli decydujesz, czy zmiany zrobione przez Twoje zapytania mają zostać trwale zapisane, czy wyrzucone do kosza. Trzy podstawowe komendy to COMMIT (zatwierdź), ROLLBACK (wycofaj) i SAVEPOINT (postaw punkt kontrolny w środku transakcji). TCL działa w parze z poleceniami DML (INSERT, UPDATE, DELETE) — to one zmieniają dane, a TCL mówi, co z tymi zmianami ostatecznie zrobić.

Po co Ci to w praktyce

Transakcja to zbiór operacji, który ma się wykonać w całości albo wcale — tak działa zasada atomowości z reguł ACID. Klasyczny przykład: przelew z konta A na konto B. Najpierw odejmujesz kwotę z jednego konta, potem dodajesz do drugiego. Jeśli między tymi krokami serwer padnie, a Ty zdążyłeś już odjąć, ale nie dodać — pieniądze wyparowały. TCL pilnuje, żeby albo obie zmiany zostały zatwierdzone razem (COMMIT), albo żadna (ROLLBACK).

SAVEPOINT to drobniejszy mechanizm: stawiasz nazwany punkt w środku długiej transakcji i możesz cofnąć się tylko do niego (ROLLBACK TO savepoint), nie kasując wszystkiego od początku. Przydaje się, gdy jeden krok z dziesięciu może się wywalić, a reszta jest w porządku.

Przykład z życia

W PostgreSQL albo MySQL (silnik InnoDB) typowy przelew wygląda tak:

  • BEGIN; — start transakcji
  • UPDATE konta SET saldo = saldo - 100 WHERE id = 1;
  • SAVEPOINT po_obciazeniu;
  • UPDATE konta SET saldo = saldo + 100 WHERE id = 2;
  • COMMIT; — wszystko zapisane na trwałe

Gdyby drugi UPDATE zwrócił błąd, robisz ROLLBACK TO po_obciazeniu; albo po prostu ROLLBACK; i baza wraca do stanu sprzed BEGIN.

Na co uważać

Najczęstsza wtopa juniora: tryb autocommit. W większości klientów (np. domyślne MySQL czy psql) każde zapytanie jest od razu commitowane, więc Twój ROLLBACK nie ma czego cofać — zmiana już siedzi w bazie. Jeśli chcesz panować nad transakcją, otwórz ją jawnie przez BEGIN (lub wyłącz autocommit). Druga pułapka to długo otwarte transakcje, które blokują wiersze i potrafią zakorkować całą aplikację. Commituj możliwie szybko. I pamiętaj: TCL działa tylko na DML — operacji DDL (CREATE, ALTER, DROP) w wielu bazach (np. Oracle, MySQL) cofnąć się nie da, bo wymuszają niejawny commit.

Pojęcia powiązane: DML, DDL, DCL, transakcja, ACID, autocommit, isolation levels, blokady (locks).