java批量操作事务统一提交的核心是关闭自动提交并手动控制commit时机:先调用setautocommit(false),再执行批量sql,最后调用commit()提交;出错时必须rollback,spring中推荐使用@transactional简化处理。

Java 中批量操作时事务统一提交,核心是把多条 SQL 放进同一个事务里,等全部执行完再一次性提交,而不是每条都自动提交。关键就两点:关掉自动提交、手动控制 commit 时机。
先关闭自动提交
Connection 默认是 auto-commit 模式,每执行一条 INSERT/UPDATE/DELETE 就立刻落库,没法回滚,也谈不上“统一提交”。必须第一步调用:
- connection.setAutoCommit(false) —— 关闭自动提交,开启手动事务
- 此后所有通过该 connection 执行的 DML 操作,都暂存在当前事务中,不会写入数据库
- 如果跳过这步,后面调 commit() 也没用,系统仍按单语句提交处理
批量执行后统一 commit
数据准备好、循环插入或更新完成、业务逻辑校验通过,再执行最终提交:
- 调用 connection.commit() —— 提交整个事务,所有变更同时生效
- 适合场景:导入万条用户数据、生成一批订单、同步多个关联表记录
- 注意:commit() 不带参数,也不需要传数据;它只作用于当前 connection 上未提交的所有操作
出错必须 rollback
只要中间任意一步失败(比如主键冲突、字段超长、网络中断),就得立即回滚,否则事务挂起会锁表、占连接:
- 用 try-catch 包住批量操作代码,catch 块里调 connection.rollback()
- 建议在 finally 块中恢复 auto-commit 状态(connection.setAutoCommit(true))并关闭连接,避免连接泄漏
- 别指望连接池自动清理——未提交事务可能卡住几分钟甚至更久
用 Spring @Transactional 更省心
如果项目已集成 Spring,推荐直接用声明式事务,不用手管 commit/rollback:
- 在 Service 方法上加 @Transactional 注解
- 方法正常返回 → 自动 commit;抛出未捕获的 RuntimeException → 自动 rollback
- 想在提交后做点事(比如发 MQ、清缓存),可用 TransactionSynchronizationManager.registerSynchronization() 注册回调
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











