0Pricing
Java Academy · Lektion

Transaktionen

Commit und Rollback

Transaktionen ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine Transaktion

Eine Transaktion fasst mehrere SQL-Operationen zu einer einzigen Einheit nach dem Alles-oder-nichts-Prinzip zusammen.

Entweder ist jede Anweisung erfolgreich und die Änderungen werden dauerhaft übernommen (Commit), oder etwas schlägt fehl und alle Änderungen werden rückgängig gemacht (Rollback). So bleibt die Datenbank konsistent.

ACID in einer Minute

Transaktionen bieten die ACID-Garantien:

  • Atomarität — alles oder nichts.
  • Konsistenz — versetzt die DB von einem gültigen Zustand in einen anderen.
  • Isolation — gleichzeitige Transaktionen beschädigen einander nicht.
  • Dauerhaftigkeit — nach dem Commit bleiben Änderungen auch nach einem Absturz erhalten.

Auto-Commit-Modus

Standardmäßig laufen JDBC-Verbindungen im Auto-Commit-Modus: Jede Anweisung ist eine eigene Transaktion und wird sofort festgeschrieben.

Für einzelne Anweisungen ist das in Ordnung, aber nutzlos, wenn mehrere Schreibvorgänge gemeinsam erfolgreich sein müssen. Um Transaktionen selbst zu steuern, schalten Sie Auto-Commit aus.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/bank";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            System.out.println("Default auto-commit: " + conn.getAutoCommit());
            conn.setAutoCommit(false);
            System.out.println("Now manual: " + conn.getAutoCommit());
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Commit und Rollback

Bei deaktiviertem Auto-Commit legen Sie die Grenzen selbst fest:

  • conn.commit() macht alle ausstehenden Änderungen dauerhaft.
  • conn.rollback() verwirft sie.

Das klassische Beispiel ist eine Geldüberweisung: Ein Konto wird belastet und ein anderes gutgeschrieben. Beides muss geschehen, sonst nichts davon.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/bank";
        String debit = "UPDATE account SET balance = balance - ? WHERE id = ?";
        String credit = "UPDATE account SET balance = balance + ? WHERE id = ?";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            conn.setAutoCommit(false);
            try (PreparedStatement d = conn.prepareStatement(debit);
                 PreparedStatement c = conn.prepareStatement(credit)) {
                d.setInt(1, 100); d.setInt(2, 1); d.executeUpdate();
                c.setInt(1, 100); c.setInt(2, 2); c.executeUpdate();
                conn.commit();
                System.out.println("Transfer committed");
            } catch (SQLException ex) {
                conn.rollback();
                System.out.println("Rolled back: " + ex.getMessage());
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Muster für Rollback bei Fehlern

Die Struktur, die Sie sich merken sollten:

  • Schalten Sie Auto-Commit aus.
  • Führen Sie die Arbeit innerhalb eines inneren try-Blocks aus.
  • Rufen Sie bei Erfolg commit() auf.
  • Rufen Sie in catch rollback() auf und werfen Sie die Ausnahme erneut oder protokollieren Sie sie.

Ohne das Rollback könnte ein Fehler dazu führen, dass die Datenbank nur teilweise aktualisiert ist.

Atomarität simulieren

Hier wird das Alles-oder-nichts-Prinzip in einfachem Java modelliert, sodass der Code eigenständig ausgeführt werden kann. Wir wenden zwei Aktualisierungen auf eine Momentaufnahme an; wenn eine davon fehlschlägt, stellen wir die Momentaufnahme wieder her.

public class Main {
    public static void main(String[] args) {
        int[] balances = {500, 300};
        int[] backup = balances.clone();
        try {
            balances[0] -= 200;
            if (balances[0] < 0) throw new IllegalStateException("insufficient funds");
            balances[1] += 200;
            System.out.println("Commit: " + balances[0] + ", " + balances[1]);
        } catch (RuntimeException e) {
            balances = backup;
            System.out.println("Rollback: " + balances[0] + ", " + balances[1]);
        }
    }
}

Savepoints

Ein Savepoint ist eine Markierung innerhalb einer Transaktion. Sie können zu ihm zurückrollen, ohne die gesamte Transaktion zu verwerfen.

  • Savepoint sp = conn.setSavepoint()
  • conn.rollback(sp) macht nur die Arbeit nach diesem Punkt rückgängig.

Das ist nützlich für eine teilweise Wiederherstellung in langen Transaktionen.

Isolationsstufen

Die Isolation steuert, was eine Transaktion von den noch nicht festgeschriebenen Änderungen einer anderen Transaktion sieht. JDBC definiert die Stufen über conn.setTransactionIsolation(...):

  • TRANSACTION_READ_COMMITTED — der gängige Standard.
  • TRANSACTION_REPEATABLE_READ
  • TRANSACTION_SERIALIZABLE — am stärksten, aber am langsamsten.

Eine höhere Isolation verhindert Anomalien, verringert aber die Nebenläufigkeit.

Leseanomalien

Eine niedrigere Isolation kann Folgendes zulassen:

  • Dirty Read — das Lesen einer nicht festgeschriebenen Änderung einer anderen Transaktion.
  • Nicht wiederholbares Lesen — eine Zeile ändert sich zwischen zwei Lesevorgängen.
  • Phantomlesen — neue Zeilen erscheinen, die zu einer vorherigen Abfrage passen.

Wählen Sie die niedrigste Stufe, die dennoch die Anomalien verhindert, die Ihre Logik nicht tolerieren kann.

Auto-Commit wiederherstellen

Wenn Sie die Verbindung aus einem Pool ausgeliehen haben, stellen Sie vor der Rückgabe ihren ursprünglichen Zustand wieder her.

Setzen Sie nach einer manuellen Transaktion conn.setAutoCommit(true) wieder (oder setzen Sie den Wert zurück, den Sie beim Ausleihen vorgefunden haben), damit der nächste Nutzer nicht von Ihren Einstellungen überrascht wird.

Transaktionen kurz halten

Eine Transaktion hält Sperren, bis sie festgeschrieben oder zurückgerollt wird. Lange Transaktionen blockieren andere Vorgänge und erhöhen das Deadlock-Risiko.

  • Führen Sie keine langsamen Netzwerkaufrufe aus und warten Sie nicht auf Benutzereingaben, solange eine Transaktion geöffnet ist.
  • Sammeln Sie zunächst Ihre Daten, öffnen Sie dann die Transaktion, schreiben Sie die Daten und führen Sie schnell einen Commit durch.

Kurze, fokussierte Transaktionen lassen sich deutlich besser skalieren.

Kurztest

Was bewirkt der Aufruf von connection.rollback()?

Zusammenfassung

Transaktionen bieten Sicherheit nach dem Alles-oder-nichts-Prinzip:

  • Schalten Sie Auto-Commit mit setAutoCommit(false) aus.
  • commit() bei Erfolg, rollback() bei einem Fehler.
  • Verwenden Sie Savepoints für ein teilweises Rollback.
  • Passen Sie die Isolationsstufen an, um Korrektheit und Nebenläufigkeit auszubalancieren.
  • Stellen Sie Auto-Commit wieder her, bevor Sie eine Verbindung an den Pool zurückgeben.

Häufig gestellte Fragen

Ist die Lektion „Transaktionen“ kostenlos?

Ja — der vollständige Text von „Transaktionen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Transaktionen“?

Commit und Rollback Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Transaktionen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. JDBC-Grundlagen
  2. PreparedStatement
  3. Transaktionen
  4. Connection Pooling mit HikariCP
← Zurück zu Java Academy