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 transakcjiUPDATE 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).