※ ChatGPTを利用し、要約された質問です(原文:executeBatch() のあとrollback()が効かない)
executeBatch() のあとrollback()が効かない
このQ&Aのポイント
Javaでデータベース更新プログラムを作成しています。しかしBatch処理の中でエラーが発生したときrollbackが正しく効きません。
センセーショナルなタイトル : executeBatch() のバグが発生!rollback()が無力に?
Windows2K、MYSQLを使用している環境で、Javaでデータベース更新プログラムを作成しています。Batch処理の中でエラーが発生したときに、rollback()が正しく機能しない問題が発生しています。
executeBatch() のあとrollback()が効かない
Windows2K
MYSQL
Javaでデータベース更新プログラムを作成しています。
しかしBatch処理の中でエラーが発生したときrollbackが正しく効きません。下にコードを示します。何か間違えているところがあれば指摘してください。
Connection con = null;
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://SUN:3306/TestDB", "sa", "sa");
con.setAutoCommit(false);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
stmt.addBatch( "UPDATE TblA SET colB=11" WHERE colA=1);
stmt.addBatch( "UPDATE TblA SET colB=12" WHERE colA=2);
stmt.addBatch( "UPDATE TblA SET colB=13" WHERE colA=3);
stmt.addBatch( "UPDATE TblA SET colB=14" WHERE colA=4);
stmt.addBatch( "UPDATE TblA SET colB=15" WHERE colA=5);
// ↓このあとエラーになるSQLをいれてExceptionを発生させたんですが、
// 上のUpdate文はすべて更新されてしまいました。★★★★★★★?????????
stmt.addBatch( "UPDATE TblA SET colB='ABD' WHERE colB=10" );
int [] updateCounts = stmt.executeBatch();
con.commit();
stmt.close();
con.close();
} catch(Exception e) {
try {
con.rollback();
System.out.println("ROLL BACK"); // ★★★ここまで正しく表示されます。
}
catch (Exception ex) {
System.err.println("rollback error: " + ex.getMessage() );
}
}
お礼
ご回答ありがとうございます。 おかげさまで解決できました。 今後ともよろしくお願いします。