Java JDBC事务手动控制需先调用setAutoCommit(false),再执行SQL,成功则commit()、异常则rollback(),并确保资源释放;事务仅限单个Connection,DDL会隐式提交,须防超时与锁表。

Java JDBC 中事务的手动控制,核心在于关闭自动提交、显式调用 commit() 或 rollback(),并做好异常处理和资源释放。
关闭自动提交
Connection 默认是自动提交模式(autocommit = true),每条 SQL 执行后立即生效。要手动控制事务,必须先调用 setAutoCommit(false):
- 这一步必须在执行任何业务 SQL 之前完成
- 如果连接已处于手动提交状态,重复调用不会报错,但不推荐依赖此行为
- 建议在 try 块开头就设置,避免遗漏
正常提交与异常回滚
执行完所有业务操作后,若无异常,调用 commit();发生异常时,必须调用 rollback() 撤销已执行的变更:
-
commit()成功后,事务结束,连接恢复到 autocommit = false 状态(不是自动恢复为 true) -
rollback()可在任何时候调用,包括未 commit 也未 rollback 的情况下 - 不要只在 catch 块里写 rollback,最好在 finally 或 try-with-resources 的 close 前统一处理
典型写法(推荐 try-with-resources + 显式 rollback)
以下是一个安全、简洁的模板:
try (Connection conn = dataSource.getConnection();
PreparedStatement ps1 = conn.prepareStatement("INSERT ...");
PreparedStatement ps2 = conn.prepareStatement("UPDATE ...")) {
conn.setAutoCommit(false); // 关闭自动提交
ps1.executeUpdate();
ps2.executeUpdate();
conn.commit(); // 全部成功,提交事务
} catch (SQLException e) {
// 发生异常,回滚
if (conn != null) {
try {
conn.rollback();
} catch (SQLException rollbackEx) {
rollbackEx.printStackTrace();
}
}
throw e; // 重新抛出原始异常
}
注意:上面代码中 conn 不能直接放在 try-with-resources 里(因为需要手动 rollback),所以通常单独管理 connection,或使用更严谨的嵌套 try。
注意事项
- 事务只对当前 Connection 有效,多个 Connection 之间不共享事务上下文
- DDL(如 CREATE TABLE)语句在多数数据库中会隐式提交当前事务,需特别留意
- 长时间不 commit 或 rollback 可能导致连接被数据库超时断开或锁表
- 生产环境建议配合连接池使用,并确保连接归还前事务已明确结束(commit/rollback)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











