在Java中使用JDBC设置事务为手动提交模式,需先调用conn.setAutoCommit(false)关闭自动提交,再执行DML操作,最后根据结果调用commit()或rollback();务必在finally中恢复auto-commit并释放资源。

在 Java 中使用 JDBC 设置事务为手动提交模式,关键在于关闭连接的自动提交(auto-commit)功能。默认情况下,JDBC 连接是自动提交的,即每执行一条 SQL 语句就立即生效;而手动提交模式下,你需要显式调用 commit() 或 rollback() 来控制事务边界。
获取连接后立即关闭自动提交
拿到 Connection 对象后,第一时间调用 setAutoCommit(false):
- 必须在执行任何 DML(INSERT/UPDATE/DELETE)语句前设置,否则之前的操作可能已被自动提交
- 该设置只对当前连接有效,不影响其他连接或后续新连接
- 示例代码片段:
Connection conn = dataSource.getConnection(); conn.setAutoCommit(false); // 关键:开启手动事务控制
手动提交或回滚事务
在业务逻辑执行完毕后,根据结果决定提交还是回滚:
- 成功时调用
conn.commit(),持久化所有已执行的 DML 操作 - 发生异常时调用
conn.rollback(),撤销未提交的更改 - 务必在
finally块或 try-with-resources 的清理逻辑中恢复自动提交(可选但推荐),避免连接被复用时状态异常
注意资源释放与异常处理
手动事务要求更严格的错误处理和资源管理:
- 使用 try-catch-finally 或 try-with-resources 确保
commit()/rollback()一定会被执行 - 不要在 catch 块中吞掉异常后不回滚,否则事务处于“挂起”状态,可能导致数据不一致
- 如果使用连接池(如 HikariCP、Druid),回滚后建议显式关闭连接或交还给池,避免脏状态传播
完整简易示例
以下是一个典型的手动事务操作结构:
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false);
PreparedStatement ps1 = conn.prepareStatement("UPDATE account SET balance = ? WHERE id = ?");
ps1.setDouble(1, newBalance);
ps1.setInt(2, accountId);
ps1.executeUpdate();
PreparedStatement ps2 = conn.prepareStatement("INSERT INTO log (...) VALUES (...)");
ps2.executeUpdate();
conn.commit(); // 全部成功才提交
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback(); // 出错就回滚
} catch (SQLException rollbackEx) {
rollbackEx.printStackTrace();
}
}
throw e;
} finally {
if (conn != null) {
try {
conn.setAutoCommit(true); // 恢复默认,便于复用
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











