Commit MySQLowych transakcji

Jak dobrze wiemy transakcje czasami się przydają. Wprawdzie używamy ich rzadko ale niekiedy są idealnym rozwiązaniem służącym głównie upraszczaniu kodu (nie musimy stosować wielu warunków) i zapewnienia integralności zapisywanych do bazy danych.

Kilkukrotnie jednak mieliśmy problem ze stwierdzeniem co dzieje się jeśli program zakończy swoje działanie po wykonaniu SQLa BEGIN (czy też START TRANSACTION). Przeprowadziłem mały inwestygejszyn i chciałbym to tutaj raz na zawsze wyjaśnić :)

Wygląda to tak, że dopóki nie wykonamy SQLa COMMIT dopóty zmiany nie zostaną zachowane w bazie. W praktyce nie trzeba nawet robić ROLLBACK – jeśli do końca danego połączenia nie wykonamy komita, to dane się nie zapiszą.

Poniżej przykład:

BEGIN;
INSERT INTO site_sessions SET sid = '123456';

Wykonanie tego przykładu i zakończenie połączenia nie spowoduje wstawienia rekordu do tabeli sessions.

BEGIN;
INSERT INTO site_sessions SET sid = '123456';
COMMIT;

natomiast to jak najbardziej zadziała :) Być może są jakieś wyjątki od tych reguł – ja ich nie znalazłem.

Uwaga! W ramach tego samego połączenia – jeśli nie zrobimy ROLLBACK to dane będą “dostępne” czyli wykonanie:

SELECT * FROM sessions WHERE sid = '123456';

spowoduje zwrócenie wstawionego wcześniej rekordu! Żeby tego uniknąć należy wykonać ROLLBACK (np. w przypadku kiedy jednak nie chcemy aby dane te zostały zapisane do bazy)

Uwaga! Zakończenie połączenia następuje również wtedy kiedy pojawi się jakiś błąd SQL (nasz framework w takim momencie kończy działanie z błędem lub pokazuje stosowny komunikat) więc w przypadku błędu SQL dane pomiędzy BEGIN…COMMIT nie zostaną zapisane (bo zabraknie COMMIT)

Ten wpis umieszczono w kategorii MySQL. Możesz dodać go do zakładek permalink. Dodaj komentarz lub dodaj odpowiedź (trackback): Trackback URL.

2 Komentarze

  1. Opublikowano 7 November, 2008 at 12:40 | Permalink

    Wszystko fajnie opisałeś, tylko zapomniałeś wspomnieć, że są możliwe tylko na bazach innoDB, BDB lub NDBCLUSTER. Niestety o wiele szybsze rozwiązanie w webowych serwisach, takie jak MyISAM nie posiada obsługi tranzakcji… A czasem by się przydało. :/

    Pozdrawiam,
    Rafał.

  2. dooshek
    Opublikowano 7 November, 2008 at 10:12 | Permalink

    Nie, nie zapomnialem – po prostu my juz prawie nie uzywamy MyISAM :) Bez transakcji ale przede wszystkim bez foreign keys, triggerow, stored procedures jest slabo.

Skomentuj

Twój adres email nie zostanie opublikowany i nie będzie rozpowszechniany. Wymagane pola są oznaczone *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>