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

JDBC事务中Insert/Update操作无法写入数据库问题排查

问题根源及修复方案

核心错误:执行更新时复用了查询SQL

你的代码里创建更新语句的PreparedStatement时,错误传入了查询用的sqlSelect变量,而非更新语句的sqlInsert。这导致实际执行的还是查询操作,而非Update,自然不会修改数据。

错误代码片段:

String sqlInsert = " Update Table1 Set ort = 'C' WHERE  ID = '10' ";
pepaw = conn.prepareStatement(sqlSelect); // 此处误用sqlSelect,而非sqlInsert
Integer checkInsert = pepaw.executeUpdate();

修正后的完整代码

public void pleaseDoTheWorkTest() {
    Connection conn = Transaction.getCurrentConnection();
    // 用try-with-resources自动管理资源,无需手动close
    try (PreparedStatement selectStmt = conn.prepareStatement("Select ID FROM Table1 WHERE ort = 'B'");
         PreparedStatement updateStmt = conn.prepareStatement("Update Table1 Set ort = 'C' WHERE ID = '10'")) {

        conn.setAutoCommit(false);

        // 执行查询
        boolean checkSelect = selectStmt.execute();
        // 可在此处处理查询结果,比如通过ResultSet获取数据

        // 执行更新并验证影响行数
        int updateCount = updateStmt.executeUpdate();
        System.out.println("更新影响行数:" + updateCount);

        conn.commit();
    } catch (SQLException e) {
        // 异常时必须回滚事务
        if (conn != null) {
            try {
                conn.rollback();
            } catch (SQLException rollbackEx) {
                rollbackEx.printStackTrace();
            }
        }
        throw new RuntimeException("数据库操作失败", e);
    }
}

其他注意事项

  • 资源管理:使用try-with-resources语法自动关闭PreparedStatement,避免手动关闭时因异常导致资源泄漏。
  • 事务回滚:异常分支必须添加rollback(),防止事务挂起占用数据库连接。
  • 变量命名:规范变量名(如pepaw改为selectStmt/updateStmt),降低SQL语句混淆概率。
  • 结果验证:通过executeUpdate()返回的影响行数,直接确认更新是否生效,便于排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:02:38