java事务核心在于搭清逻辑链路、踩准执行节点、守住资源边界,需禁用autocommit、三段闭环(开启-执行-终局)、异常必rollback且单独捕获、资源用try-with-resources零泄漏。

一、数据源与连接池要能控 autoCommit
事务起点是 Connection 的 autoCommit 状态,所以必须确保:
- 使用的数据库驱动支持标准 JDBC 事务(MySQL 8+、PostgreSQL、Oracle 都没问题)
- 连接池(如 HikariCP、Druid)配置中禁用自动提交,例如 HikariCP:
auto-commit=false(不是默认值!) - 若手写 DriverManager.getConnection,务必在获取后立刻调用
conn.setAutoCommit(false),不能晚于第一条 SQL
二、事务代码结构必须三段闭环
一个最小但完整的事务单元,代码骨架必须包含且仅包含三个明确阶段:
-
开启事务:
conn.setAutoCommit(false)—— 这不是可选初始化,而是事务真正开始的标志 - 执行操作:用同一个 conn 创建 PreparedStatement 执行多条 SQL(增删改),中间不 commit
-
终局决策:成功则
conn.commit();异常则conn.rollback(),且 rollback 必须捕获自身异常并记录
三、异常处理不能“假装兜住”
常见错误是 catch 了 SQLException 却没 rollback,或 rollback 失败后静默吞掉。正确做法:
- 所有业务异常(包括 RuntimeException)都应触发 rollback,不能只等 SQLException
- rollback 调用要单独 try-catch:
try { conn.rollback(); } catch (SQLException e) { log.warn("rollback failed", e); } - rollback 后仍需 close 连接 —— 提交或回滚 ≠ 释放连接
四、资源释放必须“零泄漏”
Connection、PreparedStatement、ResultSet 全部实现 AutoCloseable,推荐统一用 try-with-resources:
try (Connection conn = ds.getConnection();
PreparedStatement ps1 = conn.prepareStatement("UPDATE ...");
PreparedStatement ps2 = conn.prepareStatement("INSERT ...")) {
conn.setAutoCommit(false);
ps1.executeUpdate();
ps2.executeUpdate();
conn.commit();
}
若手动 close,每个 close 都得独立 try-catch,避免前一个抛异常导致后续资源未释放。
不复杂但容易忽略。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











