2

以下のコードのような単純なデータベース トランザクションがあります。最初のクエリは正常に動作するはずですが、2 番目のクエリは例外をスローする必要があるため、トランザクションは実行されません。

問題は、このコードを実行した後、最初のクエリがトランザクションではないかのようにテーブルに行を挿入したように見えることです。コードは例外をスローしてmyCon.rollback();実行されますが、その新しい行はとにかくテーブルに挿入されます。

何が欠けているのか正確にはわかりませんが、ヒントをいただければ幸いです。

-- 編集: 問題は、テーブルにデフォルトの MyISAM エンジンを使用していたことです。InnoDB に変更したところ、問題は解決しました。

    Connection myCon = null;

    try
    {
        Class.forName("com.mysql.jdbc.Driver");
        myCon = DriverManager.getConnection (dbUrl, dbUser, dbPass);

        myCon.setAutoCommit(false); // the intention is to do a transaction

        Statement stmt = myCon.createStatement();

        String query = "INSERT INTO tbltest(f1) VALUES (1);";
        stmt.executeUpdate(query);

        query = "INSERT INTO"; // a malformed query
        stmt.executeUpdate(query);

        con.commit();
    }
    catch(Exception e)
    {
        System.err.println(e.toString());
        myCon.rollback();
    }
    finally
    {
        myCon.close();
    }
4

2 に答える 2

5

そのようなことをサポートするには、MySQL データベースをセットアップする必要があります。これは、すべてのテーブルに InnoDB を使用することを意味すると思います。それはあなたの状況に当てはまりますか?そうでない場合は、 InnoDB テーブルを作成して再試行してください。

http://dev.mysql.com/doc/refman/5.0/en/commit.html

于 2012-11-26T23:41:10.033 に答える
5

どのMySqlエンジンを使用していますか? 私の知る限り、一部のエンジン (MyISAM など) はトランザクションをサポートしていません。InnoDB はそうします。

于 2012-11-26T23:42:48.440 に答える