【问题标题】:Update to MySQL returns 1, no errors/exception, but no updates actually take place更新到 MySQL 返回 1,没有错误/异常,但实际上没有更新
【发布时间】:2015-11-13 20:56:30
【问题描述】:

下面的方法应该使用传递给它的公司信息来更新 MySql DB。

我还有其他插入和删除方法可以正常工作,但是这个方法运行时没有异常,并且总是返回 1。

general_log 文件显示它收到了更新字符串,但仍然没有更改。

如果我直接在 MySql 工作场所运行代码,我唯一可以让它工作。

如果您需要更多信息来解决这个问题,请告诉我。 我给了你我认为需要的一切。 谢谢。

// SQL update string received from the program in the log file
//  UPDATE couponsprojectdb.company SET Email = 'admin@MyCompany.org', Password = 'pass' WHERE ID = 3


public void updateCompanyById(Company c, long id) throws SQLException 
{
        Connection conn = pool.getConnection(); // Gets an available connection from pool
        // Prepared statement string
        String sql = ("UPDATE company SET Email = ?, Password = ? WHERE ID = ?");
        PreparedStatement p = conn.prepareStatement(sql);
        p.setString(1, c.getEmail());
        p.setString(2, c.getPassword());
        p.setLong(3, id);
        int i = p.executeUpdate();
        System.out.println("changes: " + i);
        pool.releaseConnection(conn);
    }

【问题讨论】:

    标签: java mysql sql sql-update mysql-workbench


    【解决方案1】:

    在完成executeUpdate() 之后,您从未调用过conn.commit()。 Java代码返回1的原因是它成功了,但是数据库在事务结束后立即回滚了UPDATE

    您还需要关闭连接。将您的代码更改为:

    try {
        Connection conn = pool.getConnection();
        String sql = ("UPDATE company SET Email = ?, Password = ? WHERE ID = ?");
        PreparedStatement p = conn.prepareStatement(sql);
        p.setString(1, c.getEmail());
        p.setString(2, c.getPassword());
        p.setLong(3, id);
        int i = p.executeUpdate();
        conn.commit();      // <-- MAKE SURE TO COMMIT THE TRANSACTION TO THE DATABASE!!!
        System.out.println("changes: " + i);
        pool.releaseConnection(conn);
    } catch(Exception e) {
        // handle errors here
    } finally {
        try { if (p != null) p.close(); } catch (Exception e) {};
        try { if (conn != null) pool.releaseConnection(conn); } catch (Exception e) {};
    }
    

    this SO post 的大礼包让我想到了你的问题。

    【讨论】:

    • 非常感谢。 conn.commit() 成功了。但是我不确定为什么我必须这样做,因为我没有更改此方法中的 autoCommit。
    • 关于您的回答的另一个问题。我抛出了一个异常,并没有尝试、捕获、最终和 pool.releaseconnection(我知道我需要这样做)但是为什么我需要 p.close()? #1 一旦我释放连接对我来说不是吗? #2 一旦方法完成,它就可以进行垃圾收集,然后关闭??
    • 还有一件事。如果它返回 1 因为它成功了。如果我再次运行相同的代码,(在它已经进行更新之后)它仍然返回 1。如果它没有更新该行,或者该行不存在,我如何获得 0 或其他信息?
    • 对于您的第一个问题:最好按顺序分别关闭ResultSetStatementConnection,因为如果关闭失败,您仍希望有机会关闭其他人。
    • 对于第二个问题:它在执行相同的UPDATE 时返回 1,因为数据库再次执行了相同的更新操作。该行没有改变并不重要,因为发生了UPDATE。如果您在 WHERE 子句中指定一个失败的条件,它应该返回 0(请立即尝试)。
    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2017-05-21
    相关资源
    最近更新 更多