JDBC手动提交事务需先关闭自动提交模式,再执行SQL并显式commit,异常时必须rollback。1. 调用setAutoCommit(false)关闭自动提交;2. 执行DML后调用commit()统一提交;3. 异常时调用rollback()回滚并建议恢复auto-commit为true。

在 JDBC 中手动提交事务,核心是关闭自动提交模式(auto-commit),执行 SQL 操作后显式调用 connection.commit()。若出错则调用 rollback() 回滚。这是保证数据一致性的关键操作。
1. 关闭自动提交模式
默认情况下,JDBC 连接处于自动提交模式(每个 SQL 语句立即生效)。要手动控制事务,必须先关闭它:
- 调用
connection.setAutoCommit(false) - 该操作必须在执行任何 DML(INSERT/UPDATE/DELETE)前完成
- 一旦设为
false,后续所有 SQL 都会暂存在当前事务中,直到commit()或rollback()
2. 执行业务 SQL 并提交
在关闭 auto-commit 后,按顺序执行多个相关操作,全部成功再统一提交:
- 使用
PreparedStatement或Statement执行增删改操作 - 所有操作完成后,调用
connection.commit() - 例如:转账场景中,先从 A 账户扣款,再向 B 账户加款,两个操作必须同时成功或同时失败
3. 异常时必须回滚并恢复自动提交
发生异常时,未提交的更改仍处于挂起状态,必须主动回滚,否则连接可能长期占用资源或导致数据不一致:
- 在
catch块中调用connection.rollback() - 建议在
finally或 try-with-resources 的清理逻辑中,将 auto-commit 恢复为true(可选,但推荐) - 注意:
rollback()和commit()都会隐式结束当前事务,并开启新事务(如果仍为 manual-commit 模式)
4. 完整示例代码片段
(省略驱动加载和连接获取,聚焦事务逻辑)
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false); // 关键:关闭自动提交
<pre class="brush:php;toolbar:false;">PreparedStatement ps1 = conn.prepareStatement("UPDATE account SET balance = balance - ? WHERE id = ?");
ps1.setDouble(1, 100.0);
ps1.setInt(2, 1001);
ps1.executeUpdate();
PreparedStatement ps2 = conn.prepareStatement("UPDATE account SET balance = balance + ? WHERE id = ?");
ps2.setDouble(1, 100.0);
ps2.setInt(2, 1002);
ps2.executeUpdate();
conn.commit(); // 全部成功,提交事务} catch (SQLException e) { conn.rollback(); // 出错就回滚 throw e; } finally { conn.setAutoCommit(true); // 恢复默认,避免影响后续操作 conn.close(); }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











