SQL-JDBC Transakcje

0

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?

0

słowo kluczowe:
finally

HTH

0

słowo kluczowe:
finally

Sorry, ale nie rozumiem gdzie powinno być finally. Poza tym nawet jeżeli wywołam rollback() w finally to i tak może on wyrzucić wyjątek, bo np połączenie z bazą będzie zerwane, i co wtedy?

0

chyba za wiele nie możesz zrobić w takiej sytuacji.

co do finally to przydałoby się. Bo teraz nie zamknie Ci się połączenie jak poleci wyjątek. Więc w finally powinieneś zamykać połączenie, a w catch rollbackować transakcje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1