2013-02-22 137 views
6

我是Java JDBC新手,並開發小型數據庫應用程序。我從
O'Reilly - 數據庫編程與JDBC和Java第二版。JDBC:`con.rollback()`只有在`con.commit`沒有成功時纔有效果?

con.rollback()只有在con.commit沒有成功時才起作用?

其實我認爲即使con.commit()成功,調用con.rollback()也會起作用。這意味着利用它作爲'撤消'行動。

con.commit()成功後,我嘗試撥打con.rollback(),但沒有按我的猜測工作。那麼它是好的還是預期的?

這個例子是從我上面提到的書:

con.rollback()被註釋。它接近con.close()之前的結尾。嘗試取消註釋。在con.commit()成功後con.rollback()不會回滾事物。

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

它很難弄清楚你在問什麼。如果提交成功,那麼它完成,完成,你不能在這一點回滾。在調用'commit'方法之前,您必須標記事務以回滾***。 – Perception 2013-02-22 19:40:33

回答

9

當您撥打commit()時,您完成/關閉當前交易。因此,由於rollback()取消了當前事務中的任何更改(按照javadoc),它將無效。

3

僅當con.commit未成功時,con.rollback()纔有效嗎?

,它也有效果,如果你con.commit之前調用它。而前提是,連接的自動提交模式應該使用con.setAutoCommit(false)
您在使用使用JDBC DML SQL查詢與con.setAutoCommit(false)直到con.commit()被稱爲不致力於爲客戶數據庫,數據庫中進行的任何交易是虛假的。您在數據庫中進行的最新提交的事務處理作爲該連接的savepoint。當您撥打con.rollback()您在此之後完成的所有交易savepoint已撤消。此外,如果在調用con.commit()時發生某種異常,則表示事務未保存在數據庫中。如果con.commit()失敗,最好在catch聲明中調用con.rollback()

+0

保存點是一個不同但相關的概念:保存點位於事務內部,並允許您在不重做整個事務的情況下可以回滾的事務中標記點。 – 2013-02-23 07:23:44

+0

@MarkRotteveel:那和我在文章中提到的有什麼不同呢? – 2013-02-23 12:01:33

+0

區別在於,您可以在活動事務中擁有一個或多個保存點。 – 2013-02-23 12:52:11

相關問題