Java JDBC手动管理事务核心是:关自动提交(setAutoCommit(false))、执行SQL、显式commit或rollback;必须在DML前关闭自动提交,用同一Connection,异常时rollback,finally中恢复autoCommit并close。

Java 中用 JDBC 手动管理事务,核心就三点:关自动提交、执行 SQL、显式 commit 或 rollback。默认 Connection 是自动提交的,每条 update/insert/delete 都立刻生效;要让多条语句“绑在一起”,必须主动关闭自动提交。
手动开启事务的关键操作
开启事务不是调用一个“start”方法,而是通过 关闭自动提交模式 来实现:
- 调用 conn.setAutoCommit(false) —— 这才是真正的“开启事务”动作
- 必须在执行任何 DML(增删改)语句之前设置,否则前面的语句已自动提交,无法纳入当前事务
- 同一个 Connection 实例必须贯穿整个事务过程(不能换连接)
提交事务的时机和写法
所有 SQL 执行成功后,调用 commit 才真正把变更持久化到数据库:
- conn.commit():提交后,事务结束,数据写入磁盘,不可逆
- commit 必须在 没有异常 的情况下调用;一旦抛出 SQLException,应立即 rollback
- commit 后,Connection 仍处于
autoCommit = false状态,如需后续操作,建议恢复为 true(避免影响其他逻辑)
配套的异常处理与资源清理
事务失败时不能只 catch 异常,必须主动回滚并释放资源:
立即学习“Java免费学习笔记(深入)”;
- 在 catch 块中调用 conn.rollback(),撤销事务内所有已执行但未提交的操作
- finally 块里建议执行 conn.setAutoCommit(true),还原连接默认行为
- 最后 close 连接,防止连接泄漏(若使用连接池,close 实际是归还而非销毁)
一个简洁可靠的模板
以下结构覆盖了开启、执行、提交/回滚、复位、关闭全流程:
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false); // 开启事务
PreparedStatement ps1 = conn.prepareStatement("UPDATE ...");
ps1.setXXX(...);
ps1.executeUpdate();
PreparedStatement ps2 = conn.prepareStatement("INSERT ...");
ps2.setXXX(...);
ps2.executeUpdate();
conn.commit(); // 全部成功,提交
} catch (SQLException e) {
conn.rollback(); // 出错就回滚
throw e;
} finally {
conn.setAutoCommit(true); // 恢复默认
conn.close();
}


















