Transaktionen & ACID: Datenintegrität sicherstellen | Enjyn Gruppe
Hallo Welt
Hallo Welt
Original Lingva Deutsch
Übersetzung wird vorbereitet...
Dieser Vorgang kann bis zu 60 Sekunden dauern.
Diese Seite wird erstmalig übersetzt und dann für alle Besucher gespeichert.
0%
DE Zurück zu Deutsch
Übersetzung durch Lingva Translate

241 Dokumentationen verfügbar

Wissensdatenbank

Datenbank Transaktionen ACID

Zuletzt aktualisiert: 20.01.2026 um 10:02 Uhr

Transaktionen & ACID: Datenintegrität sicherstellen

Transaktionen garantieren, dass Datenbankoperationen ganz oder gar nicht ausgeführt werden. ACID beschreibt die Eigenschaften zuverlässiger Transaktionen.

Was ist eine Transaktion?

Eine Transaktion ist eine Gruppe von Operationen, die als Einheit behandelt wird:

-- Beispiel: Geld überweisen
-- Beide Operationen müssen erfolgreich sein oder beide scheitern!

START TRANSACTION;

UPDATE konten SET saldo = saldo - 100 WHERE id = 1;  -- Abbuchung
UPDATE konten SET saldo = saldo + 100 WHERE id = 2;  -- Gutschrift

COMMIT;  -- Alles speichern

-- Oder bei Fehler:
ROLLBACK;  -- Alles rückgängig

ACID-Eigenschaften

Atomicity (Atomarität)

Alles oder nichts. Entweder werden alle Operationen ausgeführt oder keine.

START TRANSACTION;
UPDATE konten SET saldo = saldo - 100 WHERE id = 1;  -- Erfolgreich
UPDATE konten SET saldo = saldo + 100 WHERE id = 99; -- Fehler: Konto existiert nicht!
-- Automatisch oder manuell: ROLLBACK
-- Erste Änderung wird auch rückgängig gemacht

Consistency (Konsistenz)

Datenbank bleibt immer in gültigem Zustand. Constraints werden eingehalten.

-- Constraint: saldo >= 0
ALTER TABLE konten ADD CONSTRAINT check_saldo CHECK (saldo >= 0);

START TRANSACTION;
UPDATE konten SET saldo = saldo - 1000 WHERE id = 1;
-- Fehler wenn Saldo unter 0 fallen würde
-- Transaktion wird abgebrochen

Isolation

Transaktionen beeinflussen sich nicht gegenseitig. Parallel laufende Transaktionen sehen keine Zwischenstände.

-- Transaktion A                      -- Transaktion B
START TRANSACTION;                    START TRANSACTION;
SELECT saldo FROM konten WHERE id=1;
-- Sieht: 1000
                                      UPDATE konten SET saldo=500 WHERE id=1;
                                      -- Noch nicht committed!
SELECT saldo FROM konten WHERE id=1;
-- Sieht immer noch: 1000 (je nach Isolation Level)
                                      COMMIT;
SELECT saldo FROM konten WHERE id=1;
-- Jetzt: 500
COMMIT;

Durability (Dauerhaftigkeit)

Nach COMMIT sind Daten permanent gespeichert. Selbst bei Stromausfall gehen sie nicht verloren.

Isolation Levels

Level Dirty Read Non-Repeatable Read Phantom Read
READ UNCOMMITTED Möglich Möglich Möglich
READ COMMITTED Verhindert Möglich Möglich
REPEATABLE READ Verhindert Verhindert Möglich
SERIALIZABLE Verhindert Verhindert Verhindert
-- Isolation Level setzen
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- ...
COMMIT;

-- Oder für Session
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Anomalien erklärt

-- Dirty Read: Uncommittete Daten lesen
-- Transaktion B liest Änderung von A, die später zurückgerollt wird

-- Non-Repeatable Read: Gleiche Query, unterschiedliche Ergebnisse
-- SELECT gibt verschiedene Werte innerhalb einer Transaktion

-- Phantom Read: Neue Zeilen erscheinen
-- SELECT * WHERE price < 100 gibt beim zweiten Mal mehr Zeilen

Transaktionen in PHP (PDO)

<?php
try {
    $pdo->beginTransaction();

    $pdo->exec("UPDATE konten SET saldo = saldo - 100 WHERE id = 1");
    $pdo->exec("UPDATE konten SET saldo = saldo + 100 WHERE id = 2");

    // Prüfen ob alles OK
    $stmt = $pdo->query("SELECT saldo FROM konten WHERE id = 1");
    if ($stmt->fetchColumn() < 0) {
        throw new Exception("Nicht genug Guthaben");
    }

    $pdo->commit();
    echo "Überweisung erfolgreich";

} catch (Exception $e) {
    $pdo->rollBack();
    echo "Fehler: " . $e->getMessage();
}

Transaktionen in Node.js

const connection = await mysql.createConnection(config);

try {
    await connection.beginTransaction();

    await connection.execute(
        'UPDATE konten SET saldo = saldo - ? WHERE id = ?',
        [100, 1]
    );

    await connection.execute(
        'UPDATE konten SET saldo = saldo + ? WHERE id = ?',
        [100, 2]
    );

    await connection.commit();
    console.log('Überweisung erfolgreich');

} catch (error) {
    await connection.rollback();
    console.error('Fehler:', error.message);
}

Deadlocks

Wenn zwei Transaktionen auf Ressourcen warten, die der andere hält:

-- Transaktion A                      -- Transaktion B
LOCK Zeile 1                          LOCK Zeile 2
-- Wartet auf Zeile 2                 -- Wartet auf Zeile 1
-- DEADLOCK!

-- Datenbank erkennt das und bricht eine ab

Deadlocks vermeiden

  • Ressourcen immer in gleicher Reihenfolge sperren
  • Transaktionen kurz halten
  • Bei Deadlock: Transaktion wiederholen

Savepoints

START TRANSACTION;

INSERT INTO log VALUES ('Start');

SAVEPOINT before_risky;

-- Riskante Operation
UPDATE important_data SET value = 'new';

-- Falls etwas schiefgeht
ROLLBACK TO before_risky;

-- Andere Änderungen bleiben
COMMIT;

Best Practices

💡 Empfehlungen:
  • Transaktionen so kurz wie möglich halten
  • Nur zusammengehörende Operationen gruppieren
  • Isolation Level bewusst wählen (meist READ COMMITTED)
  • Fehlerbehandlung mit ROLLBACK implementieren
  • Bei Deadlock: automatisch wiederholen

Weitere Informationen

Enjix Beta

Enjyn AI Agent

Hallo 👋 Ich bin Enjix — wie kann ich dir helfen?
120