2013-02-22 29 views
6

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(); 
       } 
      } 
     } 
    } 
} 
+2

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

Odpowiedz

9

Po wywołaniu commit(), zakończenie/zamknięcie bieżącej transakcji. Tak więc, od rollback() cofa wszelkie zmiany w bieżącej transakcji (jak na javadoc), to faktycznie nic nie zrobi.

3

Czy con.rollback() działa tylko wtedy, gdy con.commit nie powiodło się?

TAK I ma on także wpływ jeśli nazywają go przed con.commit. A warunkiem jest to, że automatyczne zatwierdzanie trybu połączenia powinny być fałszywe użyciu con.setAutoCommit(false)
każdą transakcję, która dokonane w bazie danych przy użyciu DML zapytań SQL za pomocą JDBC z con.setAutoCommit(false) nie jest zobowiązana do bazy aż con.commit() nazywa. Ostatnia zatwierdzona transakcja, którą wykonujesz w bazie danych, działa jako savepoint dla tego połączenia. Po wywołaniu con.rollback() wszystkie transakcje, które zostały wykonane po tym, jak savepoint zostanie cofnięte. Również jeśli wystąpi wyjątek podczas wywoływania con.commit(), oznacza to, że transakcje nie są zapisywane w bazie danych. Dobrą praktyką jest wywoływanie instrukcji con.rollback() w catch, jeśli nie powiedzie się con.commit().

+0

Punkty zapisu są inną, ale pokrewną koncepcją: punkty zapisu znajdują się wewnątrz transakcji i umożliwiają oznaczanie punktów w transakcji, do której można przywrócić, bez ponawiania całej transakcji. –

+0

@MarkRotteveel: Jak to się różni od tego, o czym wspomniałem w moim poście? –

+0

Różnica polega na tym, że możesz mieć jeden lub więcej punktów zapisu w aktywnej transakcji. –