You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java JDBC执行MySQL update后数据库未实际更新问题求助

问题根因

核心问题是你关闭了JDBC自动提交但未手动提交事务,更新操作未持久化到数据库。

  • 类内查询能读到更新值:showName和update方法共用同一个数据库连接,处于同一个未提交的事务上下文,当前会话可以读取到本事务内未提交的临时修改。
  • 命令行查不到更新:未提交的事务修改对其他数据库会话不可见,只要事务不提交,修改不会写入数据库持久化存储,连接关闭时未提交的事务会直接回滚。
具体代码问题点
  1. 构造函数中显式执行了connection.setAutoCommit(false);,关闭了JDBC默认的自动提交机制,此时所有增删改操作执行后必须手动调用commit才能生效。
  2. update方法执行完executeUpdate()后,没有调用connection.commit()提交事务,是更新不落地的直接原因。
  3. 存在额外的资源泄漏隐患:
    • update方法内定义了和类成员重名的局部变量PreparedStatement preparedStatement,类的close方法只会关闭成员变量的statement对象,实际执行更新的局部statement不会被关闭,会持续占用数据库资源。
    • SQL执行异常时没有触发事务回滚,会导致事务长时间悬挂。
    • showName方法中创建的ResultSet、PreparedStatement对象没有及时释放。
修复方案

方案1:保留手动事务管控(适合需要多操作组合成原子事务的场景)

修改update方法,执行更新成功后手动提交,异常时回滚,同时修正局部变量重名问题:

public void update(String A , String B , int C , int D)  {
    try{
        // 直接使用类成员的preparedStatement,避免局部变量覆盖导致资源泄漏
        preparedStatement = connection.prepareStatement("UPDATE "+ A + " SET " + B + " =? WHERE ID = ? ;");
        preparedStatement.setInt(1,C);
        preparedStatement.setInt(2, D);
        preparedStatement.executeUpdate();
        // 提交事务,将修改持久化到数据库
        connection.commit();
    }
    catch (SQLException e){
        System.out.println( " Could not update data to the database " + e.getMessage());
        try {
            // 执行出错时回滚事务,避免脏数据
            connection.rollback();
        } catch (SQLException rollbackEx) {
            rollbackEx.printStackTrace();
        }
    }
}

方案2:开启自动提交(适合单条操作不需要事务组合的简单场景)

直接修改构造函数中的自动提交配置,调整setAutoCommit的参数:

public Stdn() throws SQLException {
    connection = DriverManager
            .getConnection("jdbc:mysql://localhost:1522/juni_project" , "root", "password");
    // 开启自动提交,单条DML执行完成后自动持久化
    connection.setAutoCommit(true);
}

这种情况下不需要手动调用commit,执行完executeUpdate后修改会自动同步到数据库。


内容的提问来源于stack exchange,提问作者kia_far

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:03:19