【问题标题】:How to execute RollBack after an error?出错后如何执行回滚?
【发布时间】:2016-08-12 10:50:09
【问题描述】:

我正在使用 Java 构建一个将数据存储到 Mysql 数据库中的应用程序。

所以我正在构建首先保存数据的代码,setAutocommit=false,如果数据正确保存在数据库 setAutocommit=true 上。

如果有错误执行数据回滚。

所以代码执行永远不会出错但不起作用,因为我尝试保存的数据具有主键整数自动增量,如果下次保存时出现错误,系统会跳转数字。

例如在我的数据库中提交的 CodiceFattura = 100,如果我尝试保存另一条记录 CodiceFattura = 101。现在如果我有 CodiceFattura = 100,我尝试保存,我有一个错误,我修复了错误然后保存 CodiceFattura = 102 而不是 101。

这是代码:

 public boolean salvaFattura(String tipoFattura){
        fatturaIstanza= istanziaValori(null);
        boolean tuttoOk=false;
        try{
            setCommitManager(false);
            tuttoOk=modelManager.getFatturaManager().inserisciFatturaArticoliSenzaCodice(fatturaIstanza,tipoFattura);
            if(!tuttoOk){
                VisualMessageFattura.getErrore();
                eseguiRollBack();
            }
            Integer.parseInt(null);
            setCommitManager(true);
        }
        catch(Exception e){
            VisualMessage.getShowMessaggioErroreFatturaSalvata("Fattura");
            log.logStackTrace(e);
            eseguiRollBanck();
            return false;
        }
        return tuttoOk;
    }

    public void eseguiRollBanck(){
        try{
            modelManager.getFatturaManager().eseguiRollBack();
        }catch(Exception e){
            log.logStackTrace(e);
        }
        try{
            db.eseguiRollBack();
        }catch(Exception e){
            log.logStackTrace(e);
        }
    }

    public void setCommitManager(Boolean state){
        modelManager.getFatturaManager().setAutoCommit(state);
    }

    public void eseguiRollBack(){
            try {
                db.rollback();
            } catch (SQLException e) {
                log.logStackTrace(e);
                //VisualMessage.getErroreDB();
            }
        }

public void setAutoCommit(boolean autoCommit){
        try {
            db.setAutoCommit(autoCommit);
        } catch (SQLException e) {
            log.logStackTrace(e);
            VisualMessage.getErroreDB();
        }
    }

【问题讨论】:

  • 主键的自动增量没有帮助吗?
  • 是的 CodiceFattura 字段是 PrimaryKey 和 Autoincrement
  • 不要显式传递主键的值。所以数据库会注意该字段
  • 您将自动提交设置为关闭。在写入数据库之前验证数据。在将所有数据写入数据库后执行提交,以确保数据的一致性。回滚是针对数据库错误,而不是数据验证。
  • @GilbertLeBlanc 我设置了 autoCommitFalse,如果一切正常,我设置了 autocommit(true)。如果我在存储过程中出现错误,我想做回滚,但这不起作用+

标签: java mysql rollback autocommit


【解决方案1】:

这与以下问题相同:

COMMIT OR conn.setAutoCommit(true)

简而言之,您没有以正确的方式使用 setAutoCommit,因此此代码行为是正确的,您应该显式调用 commit 方法或离开 Auto Commit 以继续自动提交事务。

【讨论】:

  • 嗯谢谢你的回答。但是在salvaFattura方法中,我将fattura保存在我的数据库中,但我在数据库中进行了其他操作,如果所有操作都正确完成,我想将autocommit设置为true。
  • AutoCommit 意味着每次执行 SQL 语句时,它都会将其作为自己的事务提交,所以这不是你想要发生的。
  • 您所说的您想要的是执行所有 SQL 语句,然后根据这些语句的结果,回滚事务或提交事务。在这种情况下,您需要将 AutoCommit 设置为 false,然后显式调用 commit()rollback() 以使保存发生或不发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2012-07-15
  • 2021-09-29
  • 1970-01-01
相关资源
最近更新 更多