MB Dev .tech
Registrieren Login

SQL · Transaktionen & Locking

← Zurück zu SQL Basics

Eine Transaktion ist wie ein „sicherer Arbeitsmodus“: Du machst mehrere Änderungen – und am Ende entscheidest du: Alles übernehmen (COMMIT) oder alles verwerfen (ROLLBACK).

Merke
Transaktionen sorgen für „ganz oder gar nicht“

Wenn etwas schiefgeht, bleibt die Datenbank in einem sauberen Zustand. Das ist besonders wichtig bei Geld, Beständen oder wichtigen Statusänderungen.

1) Ein einfaches Beispiel: „Geld überweisen“

Stell dir vor, du hast zwei Konten: Von Konto A werden 10 € abgezogen, auf Konto B werden 10 € draufgebucht. Das sind zwei UPDATEs.

Wenn nach dem ersten UPDATE etwas schiefgeht (Server-Problem, Fehler im Code), wäre Geld „verschwunden“. Genau das verhindern Transaktionen.

2) So sieht eine Transaktion in SQL aus

Grundidee: Start → Änderungen → Commit oder Rollback.

Transaktions-Template

BEGIN;

-- Änderungen...
-- UPDATE ...
-- INSERT ...
-- DELETE ...

COMMIT;   -- alles übernehmen

-- oder:
-- ROLLBACK; -- alles verwerfen
Tipp
BEGIN kann je nach DB auch START TRANSACTION heißen

Viele Datenbanken verstehen beides. In der Praxis siehst du häufig: START TRANSACTION;

3) Konkretes Beispiel (vereinfacht)

Wir haben eine Tabelle accounts:

accounts (Beispiel)

id | owner_name | balance_cents
---+------------+--------------
1  | Alex       | 5000
2  | Lina       | 2000

Jetzt überweisen wir 1000 Cent (10 €) von Konto 1 zu Konto 2:

Überweisung als Transaktion

START TRANSACTION;

UPDATE accounts
SET balance_cents = balance_cents - 1000
WHERE id = 1;

UPDATE accounts
SET balance_cents = balance_cents + 1000
WHERE id = 2;

COMMIT;
Achtung
Ohne Prüfungen ist das noch nicht „sicher“

In der Praxis würdest du z.B. prüfen, ob Konto 1 genug Guthaben hat, und du würdest bei Fehlern ein ROLLBACK ausführen. Das Prinzip ist aber genau dieses „alles oder nichts“.

4) Locking – warum sperrt eine DB manchmal Zeilen?

Datenbanken werden oft von mehreren Benutzern gleichzeitig genutzt. Wenn zwei Prozesse gleichzeitig dieselben Daten ändern, kann Chaos entstehen. Deshalb gibt es Locks (Sperren).

Ein Lock bedeutet vereinfacht: „Während ich diese Zeile ändere, soll niemand anderes sie gleichzeitig widersprüchlich ändern.“

Merke
Locks schützen vor „gleichzeitigem Überschreiben“

Ohne Locks könnten zwei Updates sich gegenseitig „wegdrücken“.

5) SELECT ... FOR UPDATE (typisches Muster)

Ein häufiges Muster ist: „Ich lese eine Zeile und will sie gleich danach ändern – aber niemand soll dazwischen funken.“ Dafür gibt es FOR UPDATE.

Zeile sperren (vereinfacht)

START TRANSACTION;

SELECT balance_cents
FROM accounts
WHERE id = 1
FOR UPDATE;

-- danach UPDATE ...

COMMIT;
Tipp
Locks bleiben bis COMMIT/ROLLBACK

Darum sollte man Transaktionen nicht unnötig lange offen lassen. Sonst blockierst du andere Prozesse.

6) Deadlocks – wenn zwei sich gegenseitig blockieren

Ein Deadlock passiert, wenn zwei Transaktionen sich gegenseitig sperren: Transaktion A wartet auf B und B wartet auf A – keiner kann weiter.

Achtung
Deadlocks sind normal – man muss nur damit rechnen

Datenbanken lösen Deadlocks meist, indem sie eine Transaktion abbrechen. In Anwendungen ist es üblich, den Vorgang dann einfach sauber zu wiederholen.

Fazit

Transaktionen sorgen dafür, dass mehrere Änderungen zusammengehören und nicht halb passieren. Locking sorgt dafür, dass parallele Zugriffe nicht zu falschen Daten führen. Beides ist ein wichtiger Schritt vom „SQL lernen“ zum „SQL sicher in echten Apps einsetzen“.

Als Nächstes
PHP & Datenbank (PDO) kommt später im Learn-Bereich

Dort schauen wir uns an, wie man Transaktionen in Code sauber benutzt (inkl. Fehlerbehandlung und Rollback).