Witam,
Proszę o pomoc w zrozumieniu transakcji.
public class Transaction {
Connection connection;
public Transaction() {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager
.getConnection("jdbc:mysql://192.168.1.25/accounts?user=spider&password=spider");
} catch (Exception e) {
System.err.println("Unable to find and load driver");
System.exit(1);
}
}
public void doWork() {
try {
java.util.Date now = new java.util.Date();
connection.setAutoCommit(false);
Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement
.executeQuery("SELECT * FROM acc_add WHERE acc_id = 1034055 and ts = 0");
// set old row ts = current time
rs.next();
rs.updateTimestamp("ts", new Timestamp(now.getTime()));
rs.updateRow();
rs.moveToInsertRow();
rs.updateInt("add_id", rs.getInt("add_id"));
rs.updateInt("acc_id", rs.getInt("acc_id"));
rs.updateString("name", rs.getString("name"));
rs.updateString("address1", "555 East South Street");
rs.updateString("address2", "");
rs.updateString("address3", "");
rs.updateString("city", rs.getString("city"));
rs.updateString("state", rs.getString("state"));
rs.updateString("zip", rs.getString("zip"));
rs.updateTimestamp("ts", new Timestamp(0));
rs.updateTimestamp("act_ts", new Timestamp(now.getTime()));
rs.insertRow();
connection.commit();
rs.close();
statement.close();
connection.close();
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException error) {
//CO ZROBIĆ TUTAJ ?????
}
}
}
Wszystko pięknie ładnie, jest commit() jeżeli wszystko się uda. Jednak rollback() musi być ujęty w bloku try-catch ---- i tu moje pytanie. Co jeżeli wystąpi tam wyjątek? Czy istnieje wtedy jakiś sposób żeby cofnąć transakcję, czy wszystko już stracone i zostaje tylko bałagan w bazie danych?