Java中commit()提交事务需先调用setAutoCommit(false)关闭自动提交,再执行SQL操作,无异常时调用commit()持久化数据,出错则rollback()回滚,且commit仅对当前Connection有效。

在 Java 中使用 commit() 方法提交数据库事务,核心是通过 JDBC 的 Connection 对象控制事务边界。默认情况下,JDBC 连接处于自动提交(auto-commit)模式,每次执行 SQL 都会立即生效;要手动控制事务,必须先关闭自动提交,执行业务操作,再显式调用 commit()。
关闭自动提交并开启事务
获取 Connection 后,第一时间调用 setAutoCommit(false),这是启用手动事务的前提:
Connection conn = dataSource.getConnection(); conn.setAutoCommit(false); // 关键:关闭自动提交,开启事务
此时后续所有 SQL 操作(如 INSERT、UPDATE、DELETE)都暂存在事务中,尚未写入数据库。
执行业务 SQL 并捕获异常
在同一个 Connection 上执行多个相关操作。一旦出错,需回滚,避免数据不一致:
- 用
PreparedStatement或Statement执行 SQL - 所有操作必须复用同一个
Connection实例 - 用
try-catch-finally或 try-with-resources 确保资源释放
成功时调用 commit() 提交事务
全部操作无异常,调用 conn.commit() 将事务中所有更改持久化到数据库:
try {
// 执行多个更新操作...
stmt1.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1");
stmt2.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2");
<pre class="brush:php;toolbar:false;">conn.commit(); // ✅ 提交事务:数据真正写入数据库} catch (SQLException e) { conn.rollback(); // ❌ 出错则回滚 throw e; } finally { conn.setAutoCommit(true); // 可选:恢复自动提交(推荐) conn.close(); }
注意:commit() 成功后,连接仍处于事务关闭状态(除非重新设为 false),但已提交的数据不可逆。若再次执行 DML 操作,需重新调用 setAutoCommit(false) 开启新事务。
常见注意事项
-
commit()只对当前Connection有效,不能跨连接或跨线程共享事务 - 某些数据库(如 MySQL)在
commit()后会隐式释放保存点和锁,但连接本身保持打开 - 不要在循环中频繁
commit(),否则失去事务原子性;也不要长期不提交,导致锁表或连接占用 - Spring 等框架中通常不直接调用
commit(),而是用@Transactional注解交由容器管理
不复杂但容易忽略:commit() 不是“保存数据”的通用方法,它只是事务生命周期中的一个明确落点——前提是你已通过 setAutoCommit(false) 把它变成一个可管理的事务单元。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











