JDBC批处理需显式事务控制才能保证原子性:先setAutoCommit(false),再addBatch/executeBatch,异常时用rollback回滚,成功后commit,并在finally中恢复auto-commit并关闭资源。

JDBC 批处理本身不自动具备原子性,必须显式结合事务控制才能保证“全成功或全失败”。关键在于:关闭自动提交、统一管理 commit/rollback,并在 executeBatch() 出错时及时回滚。
关闭自动提交是前提
批处理默认每条语句独立提交(auto-commit=true),这会破坏原子性。必须在执行前调用:
- connection.setAutoCommit(false) —— 启动事务边界
- 该操作需在获取 Connection 后、添加任何 SQL 前完成
- 若未关闭,即使 addBatch + executeBatch 成功,每条语句也已即时落库,无法整体回滚
捕获 executeBatch 异常并回滚
executeBatch() 在任意一条 SQL 执行失败时抛出 BatchUpdateException(继承 SQLException),此时必须 rollback:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 检查 getUpdateCounts() 可区分部分失败(如返回 [-3, -3, 2] 表示前两条失败,第三条成功)
- 只要出现 Statement.EXECUTE_FAILED(值为-3),就应视为事务失败
- 立即调用 connection.rollback() 撤销所有已执行的批语句
PreparedStatement + 参数化批处理更安全
相比 Statement,PreparedStatement 能避免 SQL 注入、提升复用率,且参数绑定与批处理天然契合:
- 重复调用 ps.setString(1, "xxx"); ps.addBatch();
- 一次 executeBatch() 提交全部参数化语句
- 异常时 rollback 不影响数据一致性,且数据库层能更好优化执行计划
commit 和资源清理要配对
事务成功后必须显式 commit,且无论成功失败都要恢复 auto-commit 状态并释放资源:
- 成功路径:executeBatch() → connection.commit() → connection.setAutoCommit(true)
- 失败路径:catch(BatchUpdateException e) → connection.rollback() → connection.setAutoCommit(true)
- 务必在 finally 块中 close PreparedStatement 和 Connection,防止连接泄漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










