必须先调用 connection.setAutoCommit(false) 关闭自动提交,否则 commit() 无效;业务全部成功后才调用 commit() 提交,异常时必须 rollback,Spring @Transactional 则自动处理提交与回滚。

Java 中事务在业务执行成功后调用 commit() 提交数据,核心前提是**先关闭自动提交**,再显式控制提交时机。默认情况下 Connection 是自动提交的,每条 SQL 执行完立刻生效,无法回滚,也就谈不上“业务成功后再提交”。
必须先关闭自动提交
这是手动事务的第一步,也是最关键的一步:
- 调用
connection.setAutoCommit(false)关闭自动提交模式 - 此后所有通过该 connection 执行的 DML(INSERT/UPDATE/DELETE)操作都暂存在事务中,不会写入数据库
- 若不关闭,
commit()调用无效,系统仍按单语句自动提交处理
在业务逻辑全部完成且确认无误后调用 commit()
不是一执行完 SQL 就提交,而是在整个业务流程走通、校验通过、状态一致后才提交:
- 例如转账场景:先扣减 A 账户余额,再增加 B 账户余额,两步都成功且金额匹配,才调
conn.commit() - 订单支付回调场景:查订单 → 校验幂等 → 更新订单状态 → 发送通知(非 DB 操作),只有前几步 DB 操作全部成功,才提交
- 注意:
commit()本身不带参数,直接调用即可;它会将当前事务中所有已执行的变更持久化到数据库
异常时务必 rollback,避免连接残留未提交事务
业务出错或中间步骤失败,必须主动回滚,否则事务长期挂起可能阻塞表、锁住资源:
立即学习“Java免费学习笔记(深入)”;
- 用 try-catch 包裹业务代码,catch 块中调用
conn.rollback() - 建议在 finally 或 try-with-resources 中恢复自动提交(
conn.setAutoCommit(true))并关闭连接,防止连接泄漏 - 不要依赖 JVM 或连接池自动清理——未提交事务可能持续数分钟甚至更久
使用 Spring @Transactional 时 commit 是隐式的
如果你用的是 Spring 声明式事务,不需要手写 commit():
- 方法正常返回时,Spring 在方法退出前自动触发 commit
- 方法抛出未被捕获的运行时异常(RuntimeException)或 Error 时,自动触发 rollback
- 若需在事务提交后执行某些逻辑(如发消息、更新缓存),可用
TransactionSynchronizationManager.registerSynchronization()注册回调


















