Przejdź do głównej treści
eLearner.app
Moduł 11 · Lekcja 1 z 441/57 w kursie~15 min
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.

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

Jeś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 ​​​​:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

Spróbuj sam

Ćwiczenie#sql.m11.l1.e1
Próby: 0Ładowanie...

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ę.

Ładowanie edytora...
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

Ćwiczenie#sql.m11.l1.e2
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

BEGIN;, czyste usuwanie „recenzji”, a następnie magiczne ROLLBACK; na końcu.

Rozwiązanie dostępne po 3 próbach