Java事务提交的关键是先关闭自动提交(setAutoCommit(false)),否则commit()无效;业务全部成功后再调用commit(),异常时必须rollback并清理资源;Spring中推荐使用@Transactional注解自动管理。

Java 中事务在业务执行成功后提交,关键不是“什么时候调 commit”,而是“怎么让 commit 有意义”——必须先关闭自动提交,否则 commit() 调了也白调。
必须先关闭自动提交(setAutoCommit(false))
Connection 默认是 auto-commit = true,每条 SQL 执行完立刻入库、不可回滚。要实现“全部成功再提交”,第一步就是切断这个默认行为:
- 调用 connection.setAutoCommit(false),开启手动事务边界
- 此后所有通过该 connection 执行的 INSERT/UPDATE/DELETE 都暂存于事务中,不写库
- 若跳过这步,直接调 commit(),系统会忽略——因为根本没在事务里
只在业务完全走通后才 commit()
commit() 不是执行完 SQL 就立刻调,而是在整个业务逻辑校验无误、状态一致、外部依赖(如幂等检查、库存预占)全部确认成功后才触发:
- 例如转账:扣 A 账户 → 加 B 账户 → 校验总额不变 → 才 conn.commit()
- 订单支付回调:查单 → 验签 → 更新订单状态为“已支付” → 才提交
- commit() 无参数,直接调用即可,它会把当前事务内所有 DML 变更一次性刷入数据库
异常时必须 rollback,且资源要收干净
哪怕只差最后一步出错,也要主动回滚,否则未提交事务可能长期持有锁、阻塞其他操作:
立即学习“Java免费学习笔记(深入)”;
- 用 try-catch 包裹业务代码,catch 块中必须调 conn.rollback()
- 在 finally 里恢复自动提交(conn.setAutoCommit(true))并关闭连接,防止连接池泄漏
- 别指望框架或连接池自动清理——挂起的事务可能持续数分钟以上
Spring @Transactional 是更推荐的方式
如果你用 Spring,基本不用手写 commit/rollback:
- 方法加 @Transactional,正常返回即自动 commit
- 抛出未捕获的 RuntimeException 或 Error,自动 rollback
- 需要提交后动作(如发 MQ、刷新缓存),可用 TransactionSynchronizationManager.registerSynchronization() 注册回调


















