Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 4 von 432/57 im Kurs~10 min
Lektionen des Moduls (4/4)

Transaktionen: Alles oder nichts

Eine Transaktion ist eine Gruppe von Vorgängen, die die Datenbank als solche behandelt eine einzelne Einheit: Entweder sind sie alle erfolgreich, oder keiner von ihnen hinterlässt eine Spur. So schützen Sie sich vor Inkonsistenzen bei einer Sequenz von UPDATE/INSERT/DELETE müssen konsistent bleiben.

Die Syntax

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

Alles zwischen BEGIN und COMMIT ist atomar: keine andere Verbindung sieht den Zwischenzustand. Wenn das Programm abstürzt oder ausgeführt wird ROLLBACK, die Datenbank bleibt genau so, wie sie vor BEGIN war.

Das klassische Szenario: der Transfer

Das kanonische Beispiel ist eine Umlagerung zwischen Produkten (oder einer Geldtransaktion). Übertragung zwischen Konten): zwei UPDATEs, die zusammen erfolgreich sein müssen, niemals das eine ja und das andere nein.

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

Wenn der zweite UPDATE fehlschlägt (z. B. ein CHECK-Einschränkungsfehler), a ROLLBACK stellt den Bestand von Produkt 1 wieder auf seinen ursprünglichen Wert her.

ROLLBACK: der Debugger des DBA

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

Ein sehr nützliches Muster zum Ausprobieren eines UPDATE an echten Daten: Sie Führen Sie es aus, überprüfen Sie das Ergebnis mit einem SELECT in derselben Transaktion und Wenn es Sie nicht überzeugt, verwenden Sie ROLLBACK – die Datenbank ist genau so es war vorher.

SAVEPOINT: teilweises Rollback

Innerhalb einer Transaktion können Sie Zwischenpunkte erstellen:

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

ACID in 30 Sekunden

Transaktionen garantieren die ACID-Eigenschaften:

  • Atomizität – alles oder nichts;
  • **Konsistenz – Einschränkungen bleiben zu Beginn und am Ende der Transaktion erfüllt;
  • Isolation – gleichzeitige Transaktionen sehen keine Zwischenzustände (auf verschiedenen „Ebenen“);
  • DDauerhaftigkeit – ein erfolgreicher COMMIT geht auch im Falle eines Absturzes nicht verloren.

Du bist dran

Übung#sql.m8.l4.e1
Versuche: 0Wird geladen…

In einer einzigen Transaktion: Verringern Sie den Bestand von Produkt 1 um 1 und erhöhen Sie den Bestand von Produkt 2 um 1. Öffnen Sie mit BEGIN und schließen Sie mit COMMIT.

Editor wird geladen…
Hinweis anzeigen

Referenzbestand - 1 und Bestand + 1 in den jeweiligen SET-Klauseln.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#sql.m8.l4.e2
Versuche: 0Wird geladen…

Öffnen Sie eine Transaktion, versuchen Sie, die Stadt des Kunden mit der ID=1 auf „Sperimentale“ zu aktualisieren, und brechen Sie den Vorgang dann mit ROLLBACK ab. Am Ende muss die Stadt von Kunde 1 die ursprüngliche sein („Mailand“).

Editor wird geladen…
Hinweis anzeigen

ROLLBACK verwirft jede von BEGIN an vorgenommene Änderung.

Lösung nach 3 Versuchen verfügbar