我遇到了一个我无法弄清楚的问题。
我有以下 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);
}
}
}
}