2013-02-22 30 views
6

私はJava JDBCを初めて使用しており、小さなデータベースアプリケーションを開発しました。私は
から学んでいます。O'Reilly - JDBCとJavaでのデータベースプログラミング第2版。JDBC: `con.rollback()`は`con.commit`が成功しなかった場合にのみ有効ですか?

が成功しなかった場合にのみ、con.rollback()は効果がありますか?

実際にcon.rollback()を呼び出すと、con.commit()が成功してもその効果があると思います。これは、 '元に戻す'として利用することを意味します。

con.commit()の後にcon.rollback()を呼び出してみましたが、私が推測したとおりに動作しません。だからそれは大丈夫/期待されていますか?

この例では、私は上記の本からです:

con.rollback()がコメントアウトされています。 con.close()の前に終わりに近づいています。コメントを外してみてください。 con.rollback()は、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

あなたが求めているものを作るのは難しいです。コミットが成功してから完了したら、その時点でロールバックすることはできません。あなたは 'commit'メソッドを呼び出す前にロールバック***のトランザクションをマークする必要があります。 – Perception

答えて

9

commit()に電話すると、現在の取引を完了/終了します。したがって、rollback()は現在のトランザクションの変更を(javadocごとに)元に戻すため、効果的に何も行いません。

3

con.rollback()は、con.commitが成功しなかった場合にのみ効果がありますか?

YESそして、あなたがcon.commit前にそれを呼び出す場合にも効果があります。そして、前提条件は、接続の自動コミットモードがcon.setAutoCommit(false)
あなたはcon.commit()が呼び出されるまでcon.setAutoCommit(false)がデータベースにコミットされていないとJDBCを使用してDML SQLクエリを使用して、データベースに行ったすべてのトランザクションを使用して、偽でなければならないことです。データベースでコミットした最新のトランザクションは、その接続にはsavepointとなります。 con.rollback()savepointが元に戻された後に行ったすべての取引に電話するとき。また、con.commit()を呼び出す際に例外が発生した場合、トランザクションがデータベースに保存されないことを意味します。 con.commit()が失敗した場合、をcatchステートメントに呼び出すことをお勧めします。

+0

セーブポイントは異なる概念です。セーブポイントはトランザクション内にあり、トランザクション全体をやり直すことなくロールバックできるポイントをマークすることができます。 –

+0

@MarkRotteveel:私の記事で言及したこととどう違うのですか? –

+0

違いは、アクティブなトランザクション内に1つまたは複数のセーブポイントを持つことができる点です。 –

関連する問題