Lekcje modułu (1/4)
Transakcje ACID (BEGIN/COMMIT)
Podstawy niezawodności każdej bazy danych opierają się na akronimie ACID:
- Atomiczność: operacja albo kończy się całkowicie (Zatwierdzenie), albo kończy się niepowodzeniem, nie pozostawiając po sobie żadnych śladów połowicznie wykonanych (Wycofywanie).
- Cspójność: reguły bazy danych (np. ograniczenia, klucze obce) są zawsze przestrzegane.
- Isolacja: transakcje odbywające się w tym samym czasie nie kolidują ze sobą w niekontrolowany sposób.
- **Trwałość: po zatwierdzeniu zmiana jest nieodwracalnie zapisywana na dysku.
Składnia transakcji
Zwykle każde pojedyncze zapytanie UPDATE lub DELETE jest traktowane jako samodzielna transakcja (autozatwierdzenie). Jeśli jednak chcesz zgrupować wiele operacji, na przykład obciążenie rachunku klienta i złożenie zamówienia, musisz to zrobić jawnie, korzystając ze składni transakcji.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesJeśli podczas tych skomplikowanych wykonań aplikacja JavaScript, która wysłała zapytanie, zorientuje się, że wystąpił problem (na przykład w magazynie nie ma wystarczającej ilości zapasów i nastąpi awaria), wyśle :
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockSpróbuj sam
Otwórz transakcję. Zaktualizuj produkt o identyfikatorze 10, ustawiając jego „ilość” na 0 w tabeli tymczasowej (nie, czekaj, „ilość” nie znajduje się na produktach, wymyślmy: zmień „cenę jednostkową” w „elementy_zamówienia”, ale to wymaga ograniczenia. Zróbmy lepiej: zaktualizuj status zamówienia o identyfikatorze 5 na „wysłane” i pomyślnie sfinalizuj transakcję.
Pokaż wskazówkę
Zacznij od BEGIN;, zmień zamówienia dla id = 5 na status='wysłano', a następnie wyślij je za pomocą COMMIT;
Rozwiązanie dostępne po 3 próbach
Panika w produkcji! Deweloper napisał polecenie DELETE bez WHERE, historycznie usuwając wszystkie recenzje. Pokażmy im, jak odbywa się wycofywanie zmian. Rozpocznij transakcję, uruchom szybkie DELETE, które wyczyści wszystko z „recenzji” (bez klauzuli WHERE), ale następnie użyj ratownika SQL, aby cofnąć wpływ przed zakończeniem bloku.
Pokaż wskazówkę
BEGIN;, czyste usuwanie „recenzji”, a następnie magiczne ROLLBACK; na końcu.
Rozwiązanie dostępne po 3 próbach