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

MySQL UPDATE语句修改未持久化,重启后数据恢复原状态求助

问题分析与解决方案

核心问题:事务未提交导致修改仅会话可见

你的情况是典型的数据库事务未提交表现:JDBC连接默认autoCommit为false,执行UPDATE后修改仅存在于当前事务的内存缓冲区,并未真正持久化到数据库。当前会话的查询因为在同一事务内,能读取到未提交的修改;但外部工具(如phpMyAdmin)、新会话或重启应用后,事务会自动回滚,修改完全丢失。

具体解决方法

方法1:开启自动提交

在获取数据库连接时,设置自动提交模式,让每条SQL执行后自动完成事务提交:

Connection conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(true);

方法2:手动提交事务

如果需要控制事务边界(比如多SQL原子操作),在执行完UPDATE后手动触发提交:
修改Core.getDatabase().update()方法的实现,确保执行SQL后调用commit:

public void update(String sql) throws SQLException {
    Connection conn = getConnection();
    try (Statement stmt = conn.createStatement()) {
        stmt.executeUpdate(sql);
        conn.commit(); // 手动提交事务
    } catch (SQLException e) {
        conn.rollback(); // 出错时回滚事务
        throw e;
    }
}

额外优化:修复SQL注入漏洞

你的代码直接拼接SQL字符串,存在严重的SQL注入风险,建议改用PreparedStatement重构:

public void editEntry(SearchCondition condition, EditValue... editValues) {
    String baseSql = "UPDATE `" + table.getName() + "` SET ";
    StringBuilder setClause = new StringBuilder();
    List<Object> params = new ArrayList<>();

    // 构建SET子句
    for (int i = 0; i < editValues.length; i++) {
        EditValue ev = editValues[i];
        setClause.append("`" + ev.getColumn() + "` = ?");
        if (i < editValues.length - 1) {
            setClause.append(", ");
        }
        params.add(ev.getValue());
    }
    // 构建WHERE子句
    setClause.append(" WHERE `" + condition.getColumn() + "` = ?");
    params.add(condition.getValue());

    Connection conn = Core.getDatabase().getConnection();
    try (PreparedStatement pstmt = conn.prepareStatement(baseSql + setClause)) {
        // 设置参数
        for (int i = 0; i < params.size(); i++) {
            pstmt.setObject(i + 1, params.get(i));
        }
        pstmt.executeUpdate();
        conn.commit(); // 提交事务
    } catch (SQLException e) {
        try {
            conn.rollback();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        throw new RuntimeException(e);
    }
}

验证步骤

  1. 修改后重新运行代码,执行UPDATE后查看phpMyAdmin,确认数据库值已更新;
  2. 重启应用后再次查询,确保修改持久化生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:10:26