10

私はJavaJDBCを初めて使用し、小さなデータベースアプリケーションを開発しました。私はO'Reillyから学んでいます-JDBCとJava2ndEditionを使用したデータベースプログラミング。

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

成功しても呼び出しcon.rollback()は効果があると思いました。con.commit()言い換えれば、それを「元に戻す」アクションとして利用します。

成功してから電話をかけてみcon.rollback()ましたが、期待通りに動作しません。con.commit()それで、それは大丈夫/期待されていますか?

この例は、私が上で述べた本からのものです。

の呼び出し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();
                }
            }
        }
    }
}
4

2 に答える 2

13

を呼び出すとcommit()、現在のトランザクションを完了/終了します。したがって、rollback()(javadocに従って)現在のトランザクションの変更を元に戻すため、事実上何も実行されません。

于 2013-02-22T19:46:12.190 に答える
5

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

はいそしてそれはあなたが前にそれを呼んだ場合にも効果がありますcon.commit。また、前提条件は、接続の自動コミットモードがfalseを使用することです。con.setAutoCommit(false)を指定したJDBCを使用したSQLクエリを使用con.setAutoCommit(false)
してデータベースで行うトランザクションは、が呼び出されるまでデータベースにコミットされません。データベースで行う最新のコミットされたトランザクションは、その接続のセーブポイントとして機能します。con.rollback()を呼び出すと、その後に実行したすべてのトランザクションが取り消されます。また、 con.commit()の呼び出し中に何らかの例外が発生した場合は、トランザクションがデータベースに保存されていないことを意味します。次の場合はステートメントを呼び出すことをお勧めしますDMLcon.commit()savepointcon.rollback()catchcon.commit()失敗します。

于 2013-02-22T19:47:58.140 に答える