Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误后如何执行回滚?_Java_Mysql_Rollback_Autocommit - Fatal编程技术网

Java 错误后如何执行回滚?

Java 错误后如何执行回滚?,java,mysql,rollback,autocommit,Java,Mysql,Rollback,Autocommit,我正在用Java构建一个应用程序,将数据存储到Mysql数据库中 因此,我正在构建一段代码,如果数据正确地保存在数据库上,则首先保存数据,setAutocommit=false,setAutocommit=true 如果出现错误,执行数据回滚 所以代码是execute never error,但不起作用,因为我试图保存的数据有一个主键Integer autoincrement,如果下次保存时出现错误,系统将跳转该数字 例如,在我的数据库中,如果我试图保存另一条记录CodiceFattura=10

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

因此,我正在构建一段代码,如果数据正确地保存在数据库上,则首先保存数据,setAutocommit=false,setAutocommit=true

如果出现错误,执行数据回滚

所以代码是execute never error,但不起作用,因为我试图保存的数据有一个主键Integer autoincrement,如果下次保存时出现错误,系统将跳转该数字

例如,在我的数据库中,如果我试图保存另一条记录CodiceFattura=101,则字段CodiceFattura=100。现在如果我有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();
        }
    }

这与以下问题相同:


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

主键的自动递增是否有帮助?是的,字段CodiceFattura是PrimaryKey,autoincrement不显式传递主键的值。因此,如果您将自动提交设置为off,DB会注意。在写入数据库之前,请先验证数据。在将所有数据写入数据库后执行提交,以确保数据的一致性。回滚是针对数据库错误,而不是数据验证。@GilbertLeBlanc我设置了autoCommitFalse,如果一切正常,我设置了autocommit(true)。如果我在存储过程中出错,我想执行回滚,但这不起作用+嗯,谢谢你的回答。但在salvaFattura方法中,我在数据库中保存fattura,但在数据库中执行其他操作,如果所有操作都正确完成,我希望将autocommit设置为true。autocommit意味着每次执行SQL语句时,它都会将其作为自己的事务提交,因此,这不是您希望发生的事情,您所说的是执行所有SQL语句,然后根据这些语句的结果回滚事务或提交事务。在这种情况下,您需要将AutoCommit设置为false,然后显式调用
commit()
rollback()
,以实现保存或不保存。