java中事务控制需手动关闭autocommit:调用setautocommit(false)开启事务,commit()提交或rollback()回滚,操作后应显式恢复autocommit(true)并close()连接,尤其在连接池中避免状态污染。

Java 中通过 Connection 控制事务,核心在于手动管理自动提交(auto-commit)模式:关闭自动提交才能开启事务,提交或回滚后需注意连接状态,最后记得恢复或释放资源。
关闭自动提交以开启事务
默认情况下,JDBC 的 Connection 处于自动提交模式(autoCommit = true),每条 SQL 执行后立即生效。要开启事务,必须显式关闭它:
- 调用
connection.setAutoCommit(false) - 此后所有执行的 DML(INSERT/UPDATE/DELETE)语句都暂存在事务中,不会真正写入数据库
- 该设置对当前连接有效,不影响其他连接
手动提交或回滚事务
关闭自动提交后,必须由程序决定事务结局:
- 成功时调用
connection.commit()—— 持久化所有变更 - 出错时调用
connection.rollback()—— 撤销所有未提交操作 -
注意:commit 或 rollback 后,连接仍处于
autoCommit = false状态,如需下一轮事务,不必重复关闭;但若想恢复自动提交行为,需再次调用setAutoCommit(true)
使用 try-with-resources 与显式恢复的注意事项
Connection 本身不实现 AutoCloseable(老版本 JDBC),即使新版支持,close() 也不等价于 commit() 或 rollback():
- 直接 close() 可能导致事务被静默回滚(行为因驱动而异,不可依赖)
- 推荐在
finally块或 try-catch 结尾显式 commit/rollback,并在最后调用connection.close() - 若希望连接回归自动提交状态(例如连接池场景),应在归还前调用
setAutoCommit(true),避免影响后续使用者
简单示例(无框架裸 JDBC)
(仅示意关键流程,省略异常处理和资源关闭细节)
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false); // 关闭自动提交,开启事务
PreparedStatement ps1 = conn.prepareStatement("UPDATE account SET balance = ? WHERE id = ?");
ps1.setDouble(1, 1000.0);
ps1.setInt(2, 1);
ps1.executeUpdate();
PreparedStatement ps2 = conn.prepareStatement("UPDATE account SET balance = ? WHERE id = ?");
ps2.setDouble(1, 900.0);
ps2.setInt(2, 2);
ps2.executeUpdate();
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 出错则回滚
} finally {
conn.setAutoCommit(true); // 恢复自动提交(尤其连接池中重要)
conn.close();
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











