调用 connection.setautocommit(false) 是开启事务的关键第一步,它使数据库操作脱离自动提交模式,进入手动控制状态,后续 dml 操作需显式 commit 或 rollback。

在 Java JDBC 编程中,调用 Connection.setAutoCommit(false) 是开启事务的**关键第一步**,它让数据库操作脱离“每条语句自动提交”的默认行为,进入手动控制事务的状态。
为什么 setAutoCommit(false) 就是开启事务?
默认情况下,JDBC 连接处于自动提交模式(auto-commit = true),即每执行一条 SQL(如 INSERT、UPDATE、DELETE),数据库立即持久化,无法回滚。调用 setAutoCommit(false) 后,所有后续的 DML 操作都暂存在当前事务上下文中,直到显式调用 commit() 才真正写入数据库;若发生异常或主动调用 rollback(),则全部撤销。
正确开启并使用事务的典型步骤
- 从数据源或 DriverManager 获取
Connection对象 - 立即调用
conn.setAutoCommit(false)—— 必须在执行任何业务 SQL 前设置 - 使用
PreparedStatement或Statement执行多个相关操作(如转账:扣款 + 入账) - 全部成功后,调用
conn.commit()提交事务 - 出现异常时,在
catch或finally中调用conn.rollback()回滚 - 无论提交或回滚,最后都要关闭连接(推荐使用 try-with-resources 或显式 close)
常见易错点提醒
不要在事务中途反复切换 auto-commit 状态:比如先设为 false,执行几条 SQL 后又设回 true —— 这会隐式提交当前事务,且后续语句又变成自动提交,破坏事务边界。
确保 rollback 在异常路径中被执行:尤其注意 catch 块里是否遗漏了 rollback,或 finally 里未判断连接状态就直接 commit/rollback。
Connection 必须是同一个对象:事务作用域绑定在单个 Connection 实例上。如果 DAO 层每次 new Connection 或从连接池取新连接,事务将失效。
一个简洁示例片段
try (Connection conn = dataSource.getConnection()) {
conn.setAutoCommit(false); // ✅ 关键:开启事务
try (PreparedStatement ps1 = conn.prepareStatement("UPDATE account SET balance = ? WHERE id = ?")) {
ps1.setDouble(1, oldBalance - 100);
ps1.setInt(2, 1001);
ps1.executeUpdate();
}
try (PreparedStatement ps2 = conn.prepareStatement("UPDATE account SET balance = ? WHERE id = ?")) {
ps2.setDouble(1, oldBalance + 100);
ps2.setInt(2, 1002);
ps2.executeUpdate();
}
conn.commit(); // ✅ 全部成功,提交
} catch (SQLException e) {
if (conn != null) {
conn.rollback(); // ✅ 出错回滚
}
throw e;
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











