Java手动事务控制需先关闭Connection自动提交,再显式调用commit()或rollback(),适用于JDBC原生、TransactionTemplate及PlatformTransactionManager三种场景,须注意数据源一致性、异常处理与连接释放。

在 Java 中手动提交与回滚事务,核心在于获取并控制 Connection 对象的事务行为,关闭自动提交(auto-commit),再显式调用 commit() 或 rollback()。这通常出现在 JDBC 原生操作、Spring 的 TransactionTemplate、或 Spring 中使用 PlatformTransactionManager 手动管理事务的场景中。
使用 JDBC 原生方式控制事务
这是最底层的方式,适用于不依赖 Spring 的纯 JDBC 场景:
- 从数据源获取
Connection后,立即调用connection.setAutoCommit(false) - 执行 SQL 操作(
PreparedStatement或Statement) - 若全部成功,调用
connection.commit();若发生异常,调用connection.rollback() - 务必在 finally 块中恢复 auto-commit 状态(可选但推荐)并关闭连接,避免连接泄漏和事务挂起
示例片段:
<!-- 简化示意,实际需 try-with-resources 或完整 finally -->Connection conn = dataSource.getConnection();<br>conn.setAutoCommit(false);<br>try {<br> // 执行 update / insert ...<br> conn.commit();<br>} catch (SQLException e) {<br> conn.rollback();<br> throw e;<br>} finally {<br> conn.setAutoCommit(true); // 恢复默认<br> conn.close();<br>}
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
使用 Spring TransactionTemplate 手动执行
TransactionTemplate 封装了事务开启、提交、回滚逻辑,你只需提供业务逻辑,异常时自动回滚(默认):
- 注入
TransactionTemplate(需配置好PlatformTransactionManager) - 调用
execute()方法,传入TransactionCallback或TransactionCallbackWithoutResult - 在回调中写数据库操作;若抛出运行时异常(
RuntimeException)或Error,自动回滚 - 如需**强制回滚**,可在回调中调用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
使用 PlatformTransactionManager 手动控制(较底层)
适合需要精细控制事务状态(如嵌套判断、跨多个数据源等)的场景:
- 通过
transactionManager.getTransaction(def)获取TransactionStatus - 执行业务逻辑后,调用
transactionManager.commit(status)提交 - 出错时调用
transactionManager.rollback(status) - 注意:必须保证 commit/rollback 与 getTransaction 成对,且不能重复提交或回滚
注意事项与常见陷阱
事务只对支持事务的数据库操作生效(如 MySQL 的 InnoDB 引擎),MyISAM 不支持;Connection 必须来自同一个数据源且未被其他事务占用;Spring 中若方法被 AOP 代理,直接 this. 调用会绕过事务代理;手动管理时务必处理好异常分支,避免“只 rollback 不 throw”导致上层误判成功。

















