java jdbc默认自动提交,需调用setautocommit(false)关闭以启用手动事务;成功时commit()提交,异常时rollback()回滚;事务由connection控制,ddl/dcl会隐式提交,连接关闭前须显式处理事务。

Java 中 JDBC 默认开启自动提交模式,每执行一条 DML(INSERT/UPDATE/DELETE)语句就立即生效。要实现多条语句“同进退”,必须关闭自动提交,转为手动控制事务的提交与回滚。
关闭自动提交,开启手动事务
调用 Connection.setAutoCommit(false) 是启用手动事务的第一步。这之后所有通过该 Connection 执行的 DML 操作,都暂存在数据库事务区(内存或磁盘缓冲),不会真正写入数据表。
- 必须在执行任何 SQL 前设置,否则前面已提交的操作无法纳入当前事务
- 同一个 Connection 实例必须贯穿整个事务过程(不能换连接、不能从连接池取新连接来 commit)
- 若使用连接池(如 HikariCP),需确保获取到的连接未被其他线程复用或提前归还
正常完成:显式调用 commit()
当全部 SQL 执行成功、业务逻辑验证无误后,调用 Connection.commit(),数据库才将事务区中的变更一次性刷入真实表,并清空事务区。
- commit 后,该 Connection 的 autoCommit 状态仍为 false,后续操作仍属于新事务起点(除非重置)
- 建议在 commit 成功后,手动恢复 autoCommit = true(尤其在连接池场景下,避免影响下一次借用)
- commit 失败会抛出 SQLException,通常意味着数据库层面异常(如死锁、唯一键冲突),此时也应触发回滚逻辑
发生异常:及时 rollback() 回滚
只要任意一步 SQL 报错(SQLException)、业务校验失败、或 JVM 异常中断,都应在 catch 块中调用 Connection.rollback(),撤销事务区内所有未提交的变更。
- rollback 不会抛出新异常(但可能因连接已失效而失败),建议捕获并记录日志
- 即使 rollback 失败,也不应掩盖原始异常;原始业务异常仍是主因
- 务必确保 rollback 在 finally 或 try-with-resources 的异常分支中执行,防止遗漏
补充:事务边界与资源清理
事务的生命期由 Connection 控制,始于 setAutoCommit(false),终于 commit() 或 rollback()。此外还需注意:
- DDL(如 CREATE TABLE)和 DCL(如 GRANT)语句会隐式触发 commit,打断当前事务
- 连接关闭(close)时,若 autoCommit=false 且未 commit/rollback,行为取决于驱动和数据库——多数会自动 rollback,但不可依赖
- 推荐使用 try-with-resources 管理 Statement/PreparedStatement,但 Connection 不宜用它自动关闭(因需显式 commit/rollback)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











