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); } }
验证步骤
- 修改后重新运行代码,执行UPDATE后查看phpMyAdmin,确认数据库值已更新;
- 重启应用后再次查询,确保修改持久化生效。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

