首先,我没有为这篇文章找到合适的标题,所以目前的标题似乎不合适。
第二,让我解释一下我的需求,我正在尝试执行一系列多行代码:
updateDataBase();
instruction1();
instruction2();
在执行结束时,我想确保instruction1()和instruction2()完全成功,否则执行某种回滚来取消updateDatabase()。
有没有办法在不使用新方法撤消updateDateBase()方法的情况下管理此问题。
答案 0 :(得分:0)
异常捕获然后重新抛出,因此在回滚后负责的代码的其他部分可以适当地处理。下一个级别是定义一个自定义的InstructionFailedExecption,它扩展了Exception,因此您可以在异常处理中拥有一些粒度。
private void execute() throws Exception {
try {
updateDataBase();
instruction1();
instruction2();
} catch(Exception ex){
// new rollback
rollBack();
throw ex;
}
}
答案 1 :(得分:0)
以下是我在评论中讨论的内容......这会将逻辑置于updateDatabase()方法中。
public void updateDatabase() throws Exception {
PreparedStatement updateStmt = null;
String updateString = "some sql code";
// save point to roll back to...
Savepoint savepoint = con.setSavepoint();
try {
// disable auto commit
con.setAutoCommit(false);
updateStmt = con.prepareStatement(updateString);
updateStmt.executeUpdate();
// call instructions
instruction1();
instruction2();
// if we get here then all is good, commit
con.commit();
} catch (Exception e ) {
// if we get here then instruction 1 or 2 failed... rollback
if (con != null) {
try {
System.err.print("Transaction is being rolled back");
con.rollback(savepoint);
} catch(SQLException excep) {
// log error
}
}
} finally {
if (updateStmt != null) {
updateStmt.close();
}
// set connection back to auto-commit
con.setAutoCommit(true);
}
}