conn.rollback() 上的错误未处理 SQLException...如何正确使用 commit()?

Posted

技术标签:

【中文标题】conn.rollback() 上的错误未处理 SQLException...如何正确使用 commit()?【英文标题】:Error Unhandled SQLException on conn.rollback()... How to correctly use commit()? 【发布时间】:2018-10-30 15:02:49 【问题描述】:

所以,我正在努力学习。我为slopinnes道歉。此代码进行事务处理,因此自动提交必须为 false,但它在 conn.rollback() 上引发未处理的 SQLException,我不明白为什么如果它已经在 catch(exception) 中...我应该将所有内容都包装在另一个上吗尝试捕捉?

try 
    conn.setAutoCommit(false);

    String sql="SELECT l.toy_id FROM LETTER l WHERE toy_id=?";
    PreparedStatement selectStatement = conn.prepareStatement(sql);

    String sqlD="DELETE FROM TOY WHERE toy_id=?";
    PreparedStatement deleteStatement = conn.prepareStatement(sqlD);

    String sqlU="INSERT INTO TOY (toy_id, toy_name, price,toy_type, manufacturer) VALUES (?,?,?,?,?)";
    PreparedStatement UpdateStatement = conn.prepareStatement(sqlU);

    // TODO Update or delete Toy for every row in file
    for (List<String> row : fileContents) //!!!!!!!no borrar!!!    
        int toy_id=getToyId(row);   

        //should another try go here??
        selectStatement.setInt(1, toy_id);
        ResultSet rs = selectStatement.executeQuery(sql);
        if (!rs.first()) //HERE WE DELETE
            deleteStatement.setInt(1, toy_id);
            deleteStatement.executeUpdate();
        else 
          while (rs.next()) //HERE WE UPDATE
                UpdateStatement.setInt(1, toy_id);
                UpdateStatement.executeUpdate(); 
           
               
        rs.close();     
    
    conn.commit();  

catch (SQLException e)
    System.out.println("ERRRROOOOOOORRRRR");
    conn.rollback();
   

【问题讨论】:

" 我应该把所有东西都包装在另一个 try-catch 上吗?" - 可能,是的。它给您带来问题的原因是该语句是在 try-catch 块的上下文之外执行的(是的,您在“catch”块内,但这不是一回事) 附带说明,为什么不使用数据库存储过程来执行选择、插入、更新和删除操作,并通过传递必要的参数从 Java 调用存储过程? 【参考方案1】:

第一次尝试应该引用连接(conn.setAutoCommit(false);...),内部尝试应该引用事务语句。见Transaction rollback on SQLException using new try-with-resources block

【讨论】:

【参考方案2】:

在您的 finaly 块中添加以下代码:

    try   
        if (connection != null)   
        connection.rollback();  
        connection.setAutoCommit(true);  
      
     catch (SQLException e)   
        LOG.error(e.getMessage(), e);  
      

注意:您可以再次将自动提交设置为true

【讨论】:

以上是关于conn.rollback() 上的错误未处理 SQLException...如何正确使用 commit()?的主要内容,如果未能解决你的问题,请参考以下文章

spring学习 十八 spring的声明事物

发生未处理的异常:项目不存在。角 s-s-r

Java JDBC

sed 在 MacOS 上的“未定义标签”

等效于 .try() 的哈希以避免 nil 上的“未定义方法”错误? [复制]

未处理的承诺拒绝:错误:URL 格式错误,无法解析