以下のコードのような単純なデータベース トランザクションがあります。最初のクエリは正常に動作するはずですが、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();
}