setAutoCommit()

Hallo,

kann mir jemand die Methode setAutoCommit(boolean) erklären?
Ich habe schon versucht mich mit Hilfe von Google darüber schlau zu machen, aber so richtig verstanden habe ich die ganze Sache nicht. Mir leuchtet der Unterschied nicht ganz ein, welche Vorteile bzw. Nachteile hat es ob ich meine SQL Statements als einzelne Transaktion oder als Gruppe an die Datenbank stell. Ich habe mal versucht meine Daten mit setAutoCommit(true) und auch -(false) zu schreiben und ich konnte kein Unterschied wahrnehmen, die Daten waren in der Datenbank drin so wie ich es wollte.

Ich bedanke mich schon mal im voraus, wenn sich einer die Mühe macht und versucht mir zu Helfen etwas Licht ins dunkle zu bringen.

greetz
t_2

Zwar werden bei true die Transaktionen gruppiert, aber hierin liegt weder der Vor- oder Nachteil. Der Unterschied liegt darin, dass die Transaktionen unmittelbar dauerhaft in der DB gespeichert werden oder erst explizit per Aufforderung dauerhaft gespeichert (commit) oder verworfen (reset) werden können.

Welche Datenbank benutzt Du? Je nach Implementierung im Datenbanktreiber kann es sein, dass beim schließen der DB Verbindung automatisch ein commit ausgeführt und die Daten so in der DB gespeichert werden.

#####Edit####
Die Methode heißt natürlich rollback nicht reset…

Relationale Datenbanken (MySQL/Oracle o.ä., nicht aber mongoDB) arbeiten mit Transaktionen.
Innerhalb einer Transaktion kann man verschieden Änderungen machen, die erstmal nur für den Bearbeiter selber gelten. Andere Benutzer auf der selben DB sehen diese Änderungen nicht. Mit einem einzelnen rollback kann man alle Änderungen während der aktuellen Transaktion rückgängig machen. Die Transaktion (aber nicht die Verbindung) muss mit einem commit beendet werden. Erst dann sehen andere Benutzer die Änderungen.
Wird kein commit gemacht wird die Transaktion bei Verbindungsende automatisch zurückgerollt. Besteht die Verbindung nach dem commit weiter, wird automatische eine neue Transaktion eröffnet.

Mit Hilfe der Methode setAutoCommit(true) bewirkt man, dass dieses Verhalten geändert wird und jedes Statement eine eigene Transaktion ist, die automatisch mit einem commit beendet wird.

bye
TT

Danke für die schnelle Erklärung so langsam lichtet sich das Dunkle.

Ich benutze SQLite da ich nur eine lokale Datenbank benötige.

Wenn ich das jetzt richtig verstanden habe, dann könnte ich dem zufolge, nach dem Erstellen des Statement aber noch vor den stmt.executeUpdate() mit Hilfe der Methode setAutoCommit(false) erreichen das die Änderung erstmal nur „Temporär“ durchgeführt werden und noch nicht in der Datenbank zu finden sind. Um sie endgültig zu schreiben, könnte ich einen extra Dialog machen zum Beispiel „Wollen Sie die Änderungen übernehmen JA/NEIN“ bei Ja rufe ich dann die Methode stmt.commit() und bei Nein die Methode stmt.rollback() auf.

Ist setAutoCommit(true) dann werden die Änderung sofort in die Datenbank geschrieben und können dann nur durch ein z.B. [SQL]DELETE FROM tabelle WHERE ID = 1[/SQL] wieder aus der Datenbank entfernt werden.

Es ist eigentlich weniger für so einen Dialog gedacht, als um Datenkonsistenz und Integrität zu waren.

Sagen wir du hast 100 Updates die aber alle erfolgreich sein sollen, weil sie irgendwie zusammen hängen. Dann würde man das wie folgt machen:

final boolean isAutoCommitEnabled = conn.getAutoCommit();
try{
    // um sichere transaktion zu gewährleisten
    conn.setAutoCommit(false);
    updateDB(conn);
    conn.commit();
} catch (SQLException e) {
    // da irgend ein query nicht erfolgreich war soll alles in seinen Ursprungszustand zurück (Beliebtes Beispiel Transaktionen wo alles erfolgreich sein muss damit commiten richtig sinn macht)
    stmt.rollback();
} finally {
    // auf standard zurücksetzen
    conn.setAutoCommit(isAutoCommitEnabled);
}

*** Edit ***

@Timothy_Truckle
ob andere Benutzer auf der DB die Änderungen sehen ist vom Isolationsgrad der Connection abhängig http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html#transactions_data_integrity

Genau, es geht u.a. um Sichtbarkeit von Daten zu bestimmten Zeitpunkten