2013-02-22 90 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

相关问题