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
相关产品推荐
相关产品推荐

