Przejdź do głównej treści
eLearner.app
Moduł 8 · Lekcja 4 z 432/57 w kursie~10 min
Lekcje modułu (4/4)

Transakcje: wszystko albo nic

Transakcja to grupa operacji, którą traktuje baza danych pojedyncza jednostka: albo wszyscy odniosą sukces, albo żaden z nich nie opuszcza a ślad. W ten sposób chronisz się przed niespójnościami w sekwencji UPDATE/INSERT/DELETE muszą pozostać spójne.

Składnia

SQL
BEGIN;             -- apri la transazione

UPDATE …;
INSERT …;
DELETE …;
SELECT …;          -- puoi anche solo leggere

COMMIT;            -- conferma tutte le modifiche
-- oppure
ROLLBACK;          -- annulla tutte le modifiche, come se nulla fosse

Wszystko pomiędzy BEGIN i COMMIT jest atomowe: nie ma innego połączenia widzi stan pośredni. Jeśli program ulegnie awarii lub zostanie wykonany ROLLBACK, baza danych pozostaje dokładnie taka, jak przed BEGIN.

Klasyczny scenariusz: transfer

Kanonicznym przykładem jest transfer zapasów pomiędzy produktami (lub pieniędzmi przelew pomiędzy rachunkami): dwa UPDATE, które muszą zakończyć się sukcesem razem, nigdy jedno tak, a drugie nie.

SQL
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;

Jeśli drugi UPDATE zakończy się niepowodzeniem (np. błąd ograniczenia CHECK), a ROLLBACK przywraca pierwotną wartość zapasów produktu 1.

ROLLBACK: debuger DBA

SQL
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1;   -- "vedo come è cambiato"
ROLLBACK;

Bardzo przydatny wzorzec do wypróbowania UPDATE na prawdziwych danych: ty uruchom go, sprawdź wynik za pomocą SELECT w tej samej transakcji i jeśli cię to nie przekonuje, możesz skorzystać z ROLLBACK — baza danych jest dokładnie taka sama to było wcześniej.

SAVEPOINT: częściowe wycofanie

Wewnątrz transakcji możesz tworzyć punkty pośrednie:

SQL
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT;     -- solo il primo UPDATE viene confermato

KWAS w 30 sekund

Transakcje gwarantują właściwości ACID:

  • Atomiczność – wszystko albo nic;
  • Cspójność — ograniczenia pozostają spełnione na początku i na końcu transakcji;
  • Isolation — transakcje współbieżne nie widzą stanów pośrednich (na różnych „poziomach”);
  • Niezawodność — pomyślny COMMIT nie zostaje utracony nawet w przypadku awarii.

Twoja kolej

Ćwiczenie#sql.m8.l4.e1
Próby: 0Ładowanie...

W pojedynczej transakcji: zmniejsz o 1 zapas produktu 1 i zwiększ o 1 zapas produktu 2. Otwórz za pomocą BEGIN i zamknij za pomocą COMMIT.

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

Zapas referencyjny - 1 i zapas + 1 w odpowiednich klauzulach SET.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m8.l4.e2
Próby: 0Ładowanie...

Otwórz transakcję, spróbuj zaktualizować miasto klienta o identyfikatorze = 1 na „Sperimentale”, a następnie anuluj operację za pomocą ROLLBACK. Na koniec miasto klienta 1 musi być miastem oryginalnym („Mediolan”).

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

ROLLBACK anuluje każdą zmianę dokonaną od BEGIN.

Rozwiązanie dostępne po 3 próbach