私は理解できない問題に遭遇しました。
次の SQL コード スニペットでは、テーブルに複数の行を挿入しています。例外で行が追加されないことが重要です。
コードは意図したとおりに機能しますが、ロールバック部分が削除されると、connection.commit(); であっても例外でいくつかの行が追加されます。呼び出されることはありません。何故ですか?
私の懸念は次のとおりです。バッチ挿入の呼び出し中にアプリケーションがオペレーティング システムによって強制終了され、それによってロールバック部分が呼び出されない場合はどうなりますか。私のテストでは、その場合は何も挿入されていないことが示されています。しかし、ロールバック部分が削除された場合、例外でいくつかの行が挿入される理由にまだつまずいています。
これに関するヒントはありますか?
Connection connection = null;
PreparedStatement stmt = null;
try {
connection = DBConnectionFactory.getInstance().getConnection(JDNI);
connection.setAutoCommit(false);
stmt = connection.prepareStatement(
"INSERT INTO " + TABLE_PREFIX + TABLE_OUTBOX + "...");
// add multiple statements
stmt.executeBatch();
connection.commit();
} catch (Exception ex) {
try {
log.debug(ex);
log.debug("rolling back insert message batch");
connection.rollback();
log.debug("rollback success");
} catch(Exception e) {
log.debug("unable to rollback", e);
}
throw new TranquilityException("could not insert endpoints!!", ex);
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (Exception ex) {
log.warn("Could not close sql statement", ex);
}
}
if (connection != null) {
try {
connection.setAutoCommit(true);
connection.close();
} catch (Exception ex) {
log.error("Could not close sql connection", ex);
}
}
}
}