Jestem nowy w Java JDBC i opracowałem małą aplikację bazy danych. Uczę się od
O'Reilly - programowanie w bazie danych z JDBC i Java 2nd Edition.JDBC: Czy `con.rollback()` ma efekt tylko wtedy, gdy `con.commit` nie powiodło się?
Czy con.rollback()
działa tylko wtedy, gdy con.commit
nie udało się?
Właściwie domyślam się, że wywołanie con.rollback()
ma swój efekt, nawet jeśli con.commit()
powiodło się. Oznacza to użycie go jako "Akcja.
Próbowałem wywoływać con.rollback()
po con.commit()
powiodło się, ale to nie działa tak jak się domyślałem. Czy wszystko jest w porządku/oczekiwane?
Ten przykład z książki wspomniałem powyżej:
con.rollback()
zakomentowany. jest blisko końca przed con.close()
. Spróbuj odkomentować to. con.rollback()
nie przywraca rzeczy po powodzeniu con.commit()
.
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();
}
}
}
}
}
Trudno dostrzec, o co pytasz. Jeśli zatwierdzenie zakończy się powodzeniem, to ukończone, kompletne, nie można go wycofać w tym momencie. Musisz oznaczyć transakcję do wycofania *** przed wywołaniem metody 'commit'. – Perception