JDBC: Ist `con.rollback()` hat nur einen Effekt, wenn ' Connell.commit` nicht gelungen?
Ich bin neu in Java JDBC, und entwickelt kleine Datenbank-Anwendung. Ich Lerne aus
O ' Reilly - Datenbank-Programmierung mit JDBC und Java-2. Auflage.
Ist con.rollback()
hat nur Auswirkungen, wenncon.commit
nicht gelungen?
Eigentlich denke ich, dass der Aufruf con.rollback()
hat seine Wirkung, auch wenn con.commit()
gelungen. Das bedeutet, dass die Verwendung es als " Rückgängig' Action.
Ich habe versucht, den Aufruf con.rollback()
nach con.commit()
gelungen, aber es funktioniert nicht so, wie ich vermutete. So ist es in Ordnung/zu erwarten?
Diesem Beispiel ist aus dem Buch das ich oben erwähnte:
con.rollback()
auskommentiert ist. es ist in der Nähe des Ende, bevor con.close()
. Versuchen Sie die Kommentarzeichen. con.rollback()
spielt keine Rolle Dinge wieder nach con.commit()
gelungen.
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class UpdateLogic
{
public static void main(String args[])
{
Connection con = null;
try
{
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver).newInstance();
String url = "jdbc:mysql://localhost:3306/Company";
Statement s;
con = DriverManager.getConnection(url, "root", "");
con.setAutoCommit(false); //make sure auto commit is off!
s = con.createStatement();//create the first statement
s.executeUpdate("INSERT INTO employee VALUES ('1', 'employee 1', '22','00-1234' )");
s.close(); //close the first statement
s = con.createStatement(); //create the second statement
s.executeUpdate("INSERT INTO employee VALUES ('2', 'employee 2', '21','00_4321' )");
con.commit(); //commit the two statements
System.out.println("Insert succeeded.");
s.close(); //close the second statement
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex)
{
Logger.getLogger(UpdateLogic.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException e)
{
if (con != null)
{
try
{
con.rollback();
} //rollback on error
catch (SQLException i)
{
}
}
e.printStackTrace();
} finally
{
if (con != null)
{
try
{
//con.rollback();
con.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
}
commit
Methode.InformationsquelleAutor Saleh Feek | 2013-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Aufruf
commit()
Sie complete/schließt die aktuelle Transaktion. So, darollback()
macht alle änderungen der aktuellen Transaktion (siehe javadoc), es wird effektiv nichts tun.InformationsquelleAutor jtahlborn
JA Und Es hat auch Auswirkungen, wenn Sie es nennen, bevor
con.commit
. Und Voraussetzung ist, dass autocommit Modus der Verbindung false sein sollte, mitcon.setAutoCommit(false)
Jede Transaktion, die Sie in der Datenbank mit
DML
SQL-Abfragen unter Verwendung von JDBC mit con.setAutoCommit(false) ist nicht verpflichtet, Datenbank biscon.commit()
genannt wird. Die neuesten commited Transaktion, die Sie in die Datenbank fungiert als savepoint für diese Verbindung. Wenn Sie anrufen, con.rollback() alle Transaktionen, die Sie getan haben, nach, dasssavepoint
rückgängig gemacht wird. Auch wenn einige exception tritt beim Aufruf con.commit(), es bedeutet, dass die Transaktionen nicht gespeichert in der Datenbank. Es ist eine gute Praxis zu nennencon.rollback()
imcatch
- Anweisung, wenncon.commit()
ausfällt.Also, wie ist es Verschieden von dem, was ich bereits in meinem post?
Der Unterschied ist, dass Sie können haben eine oder mehrere Savepoints innerhalb einer aktiven Transaktion.
Hi, sagten Sie: "Es ist eine gute Praxis zu nennen
con.rollback()
imcatch
- Anweisung, wenncon.commit()
ausfällt". Ist es unbedingt notwendig? Was passiert, wenn Sie es nicht tun?Wie ich erwähnt habe in meinem Beitrag, con.rollback() und con.commit() zeigt seine Wirkung nur für den falschen Modus autocommit . Nun, Wenn Sie die Durchführung einer Reihe von Transaktionen atomar und Sie bekommen ein paar Fehler, während n(>1) - te Transaktion durchführen. Dadurch wird die Steuerung zum ausführen von catch-Anweisung. In Fall, dass Sie nicht nennen
con.rollback
dann, Wenn am anderen Teil des Codes einer erfolgreichen Transaktion ist verpflichtet, die für die gleiche Connection-Objekt, dann wird dies bewirken, dass diese die Hälfte der erfolgreichen Transaktionen der erfolglosen atomaren operation zu Begehen, die auch die Ursache der Verlust der DatenintegritätInformationsquelleAutor Vishal K