2013-02-22 11 views
6

Sono nuovo di JDBC Java e ho sviluppato un'applicazione per database di piccole dimensioni. Sto imparando da
O'Reilly - Programmazione del database con JDBC e Java 2nd Edition.JDBC: `con.rollback()` ha effetto solo se`con.commit` non è riuscito?

con.rollback() ha effetto solo se con.commit non è riuscito?

In realtà, suppongo che chiamare con.rollback() abbia effetto anche se con.commit() è riuscito. Ciò significa utilizzarlo come azione "Annulla".

Ho provato a chiamare con.rollback() dopo il con.commit() riuscito, ma non funziona come ho indovinato. Quindi va bene/previsto?

Questo esempio è tratto dal libro che ho citato sopra:

con.rollback() sia commentata. è vicino alla fine prima dello con.close(). Prova a commentarlo. con.rollback() non esegue il rollback dopo il con.commit() riuscito.

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

È difficile capire cosa stai chiedendo. Se un commit ha successo allora è finito, completo, non puoi tornare indietro a quel punto. Devi contrassegnare una transazione per il rollback *** prima di *** chiamando il metodo 'commit'. – Perception

risposta

9

Quando si chiama commit(), si completa/chiude la transazione corrente. Pertanto, poiché rollback() annulla qualsiasi modifica nella transazione corrente (come per javadoc), non farà nulla in modo efficace.

3

is con.rollback() ha effetto solo se con.com non ha avuto successo?

SI e ha anche effetto se si chiama prima di con.commit. E prerequisito è che la modalità autocommit di connessione deve essere false utilizzando con.setAutoCommit(false)
Qualsiasi transazione effettuata nel database utilizzando DML query SQL mediante JDBC con con.setAutoCommit(false) non si impegna a database fino con.commit() si chiama. L'ultima transazione eseguita dall'utente nel database funge da savepoint per quella connessione. Quando si chiama con.rollback() tutte le transazioni effettuate dopo tale savepoint vengono annullate. Inoltre, se si verifica qualche eccezione durante la chiamata a con.commit(), significa che le transazioni non vengono salvate nel database. È buona norma chiamare con.rollback() nell'istruzione catch se con.commit() non riesce.

+0

I punti di salvataggio sono un concetto diverso ma correlato: i punti di salvataggio si trovano all'interno di una transazione e consentono di contrassegnare i punti in una transazione a cui è possibile eseguire il rollback senza ripetere l'intera transazione. –

+0

@MarkRotteveel: Quindi, come è diverso da ciò che ho menzionato nel mio post? –

+0

La differenza è che è possibile avere uno o più punti di salvataggio all'interno di una transazione attiva. –

Problemi correlati