执行完整的指令

时间:2017-04-17 14:37:36

标签: java hibernate

首先,我没有为这篇文章找到合适的标题,所以目前的标题似乎不合适。

第二,让我解释一下我的需求,我正在尝试执行一系列多行代码:

 updateDataBase();
 instruction1();
 instruction2();

在执行结束时,我想确保instruction1()和instruction2()完全成功,否则执行某种回滚来取消updateDatabase()。

有没有办法在不使用新方法撤消updateDateBase()方法的情况下管理此问题。

2 个答案:

答案 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);
    }
}