java中事务的commit和rollback需显式控制:先setautocommit(false)关闭自动提交,复用同一连接执行dml,成功则commit()提交,异常则catch中rollback()回滚,finally释放资源,否则静默回滚或锁泄漏。

Java 中事务管理的 commit 和 rollback 主要通过 JDBC 或 Spring 框架 实现,核心在于控制数据库操作的原子性:成功则全部提交,失败则全部回滚。
手动使用 JDBC 控制 commit 与 rollback
默认情况下,JDBC 连接处于自动提交模式(auto-commit = true),每条 SQL 执行后立即生效。要手动控制事务,必须先关闭自动提交:
- 调用
connection.setAutoCommit(false)开启事务边界 - 执行多条 SQL(如 insert/update/delete)
- 若全部成功,调用
connection.commit()持久化变更 - 若发生异常,调用
connection.rollback()撤销所有未提交操作 - 最后务必在
finally块中恢复自动提交或关闭连接,避免连接泄漏
注意:rollback() 只能回滚当前事务内未提交的操作;如果已调用过 commit(),再调用 rollback() 无效。
Spring 中声明式事务(推荐方式)
Spring 通过 @Transactional 注解简化事务管理,底层自动处理 commit 和 rollback:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 方法正常结束 → Spring 自动触发
commit - 方法抛出 运行时异常(RuntimeException)或 Error → Spring 自动触发
rollback - 抛出受检异常(Exception)默认不回滚,需显式配置:
@Transactional(rollbackFor = Exception.class) - 可指定传播行为,例如
REQUIRES_NEW会挂起当前事务、开启新事务,独立提交/回滚
示例:@Transactional(timeout = 30, rollbackFor = SQLException.class) 表示超时 30 秒或发生 SQLException 时回滚。
常见误区与注意事项
事务失效是高频问题,需特别留意:
-
@Transactional注解仅对 public 方法 生效,private 或 protected 方法上标注无效 - 同一类中非事务方法直接调用事务方法,不会走代理,事务不生效(内部调用绕过 AOP)
- 未捕获异常并“吞掉”(空 catch),导致 Spring 无法感知异常,不会 rollback
- 数据库引擎不支持事务(如 MySQL 的 MyISAM 表)会导致 commit/rollback 无效果
- 只读事务(
readOnly = true)通常跳过 commit,但依然可能触发 flush 或隐式提交,不可完全等同于禁用事务
何时该手动 commit/rollback?
多数业务场景优先使用 Spring 声明式事务;仅在以下情况考虑编程式控制:
- 需要动态决定是否提交(如根据中间计算结果分支处理)
- 跨多个数据源操作,且需实现自定义分布式事务逻辑(注意:这不是标准 JDBC 事务)
- 集成遗留系统或特殊框架,无法使用 Spring AOP
- 单元测试中模拟事务边界行为
此时建议使用 Spring 的 TransactionTemplate,比裸 JDBC 更安全,能自动处理资源释放和异常转换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










