Rozdział 11: Transakcje

Przypuśćmy, że mamy do wykonania pewną funkcjonalność w naszym programie która wymagać będzie wykonania kilku zapytań do bazy.

Co stanie się zatem w sytuacji gdy w naszym programie przestanie działać gdzieś w połowie naszych zapytań. Wykonają się wszystkie te które były przed wywołaniem błędu, a reszta już nie. Taka sytuacja doprowadzić może do pojawienia się w bazie sytuacji niedopuszczalnej, np. będziemy mieć użytkownika w tabeli bez jego metadanych które powinny się znaleźć w tabeli osobnej.

Przytoczę jeszcze jedną sytuację. Użytkownik składa zamówienie w sklepie.
Program wykonuje jedno zapytanie
1. Dopisuje do tabeli zamówienie.
Program napotyka błąd który uniemożliwia wykonanie kolejnych zapytań, a wśród nich są zapytania takie jak:
2. Powiązanie zamówienia z użytkownikiem
3. Odjęcie podanej ilości sztuk produktów ze stanów magazynowych

Mamy więc nieciekawą sytuację, wiemy że ktoś złożył zamówienie, ilość sztuk w systemie nie zgadza się, my nie wiemy kto zamówienie złożył.

Celowo pomijam fakt istnienia kolejek zadań, logowania powyższych sytuacji itd.

Jak mogą nas uchronić transakcje?

Bazy danych (w tym MySQL) umożliwiają zapakowanie wszystkich powyższych zapytań w jedną transakcję. Jeśli coś w trakcie wykonywania owych zapytań pójdzie nie po naszej myśli, zmiany które miały by dokonać wspomniane zapytania nie zostaną realnie wykonane na naszej bazie danych.

Zaczynamy

BEGIN WORK;
    UPDATE `games` SET `platform` = 'PSX' WHERE (`id` = '3');
    UPDATE `games` SET `platform` = 'PSX' WHERE (`id` = '4');
    UPDATE `games` SET `platform` = 'PSX' WHERE (`id` = '5');

Wynik powyższych zapytań, widoczny będzie tylko dla aktualnej sesji logowania. Zatem nikt z pozostałych użytkowników naszej aplikacji, nie zobaczy zmienionych danych.

Aby zatem zatwierdzić wykonanie powyższych trzech zapytań, należy wykonać kolejne polecenie bazy:

COMMIT WORK;

Mamy natomiast możliwość również przerwania naszej transakcji bez zatwierdzania zmian, za pomocą poniższego polecenia:

ROLLBACK WORK;