Przykład - koszyk zakupów w sklepie internetowym po złożeniu zamówienia
Jest to zwykle czas na wystawianie faktury (wpisy do tabeli np. faktura), która bazuje na zawartości koszyka (tabela koszyk_pozycje). Jeśli w momencie wpisu kolejnych zamówionych pozycji do tabeli faktura lub usuwania zawartości koszyka po złożeniu zamówienia (tabela koszyk_pozycje) wystąpi przerwanie komunikacji, przestanie działać system, itp. wówczas nastąpić mogą nieprzewidywalne przekłamania w zawartości wspomnianych tabel. Problem owych przekłamań rozwiązuje mechanizm transakcji, które możemy zapisać poniższym pseudo-kodem:
START_TRANSAKCJA; |
INSERT INTO faktura (...) VALUES (...); |
$faktura_id = mysql_inserted_id(); |
foreach (koszyk_pozycje){ |
INSERT INTO faktura_pozycje (...,faktura,..) VALUES (...,$faktura_id,... ); |
} |
DELETE FROM koszyk_pozycje WHERE koszyk_id = ? |
POTWIERDZ_TRANSAKCJA; |
Transakcje rozpoczynają się poleceniem BEGIN (lub BEGIN WORK (lub, jak później zobaczymy, poleceniem START TRANSACTION)) i kończa słowem COMMIT.
Przykład
mysql> CREATE TABLE tab (f INT) TYPE=InnoDB; |
Rozpocznijmy transackję, w której wstawimy nowy rekord do tablicy tab:
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO tab(f) VALUES (1); Query OK, 1 row affected (0.01 sec) |
Zobaczmy, co znajduje się w tablicy tab
mysql> SELECT * FROM tab; +---+ | f | +---+ | 1 | +---+ 1 row in set (0.00 sec) |
Nastepnie wykonajmy ROLLBACK
mysql> ROLLBACK; Query OK, 0 rows affected (0.01 sec) |
Zobaczmy jeszcze co znajduje się w tablicy tab
mysql> SELECT * FROM tab; Empty set (0.00 sec) |
Bez komendy COMMIT wstawienie nowego rekordu nie było permanentne i zostało cofnięte poleceniem ROLLBACK. Należy zauważyć, że nowy rekord byłby widoczny w tablicy w czasie wykonywania transakcji z poziomu tej samej sesji (z poziomu innej sesji nie był widoczny).
Źródło: http://gryf.mif.pg.gda.pl/~mate/wyklady/bazy/transakcje.html
Listing
Ranga: Administrator serwisu Punktów: 0