Java编程式事务需通过PlatformTransactionManager获取TransactionStatus对象,再调用commit()或rollback()手动控制;TransactionStatus不可跨线程,须妥善保管且避免与声明式事务混用。

在 Java 中使用编程式事务时,手动控制提交与回滚的核心是获取并操作 TransactionStatus 对象,再通过 TransactionManager 显式调用 commit() 或 rollback() 方法。
获取 TransactionStatus 并开启事务
编程式事务依赖 PlatformTransactionManager(如 DataSourceTransactionManager)。需先调用 transactionManager.getTransaction() 获取事务状态对象,该操作会实际开启一个新事务(或加入当前事务,取决于传播行为):
- 传入的
TransactionDefinition可指定隔离级别、传播行为、超时等,例如用DefaultTransactionDefinition设置PROPAGATION_REQUIRED - 返回的
TransactionStatus是后续提交/回滚的唯一凭证,必须妥善保存(通常放在局部变量中)
正常流程:手动提交事务
业务逻辑执行成功后,调用 transactionManager.commit(status) 提交事务:
- 提交前框架会检查事务是否已标记为 rollback-only,若已标记则抛出
UnexpectedRollbackException - 提交成功后,
status不可再用于回滚;重复调用commit()会抛异常 - 示例:
transactionManager.commit(transactionStatus);
异常情况:手动回滚事务
发生错误时,应立即调用 transactionManager.rollback(status) 回滚:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 推荐在
catch块中执行,确保异常不被吞掉 - 也可主动调用
status.setRollbackOnly()标记回滚(之后再调commit()会自动转为回滚) - 注意:回滚后再次调用
rollback()不会报错,但无实际作用
关键注意事项
编程式事务容易出错的点集中在生命周期管理和线程安全上:
-
TransactionStatus不跨线程,多线程环境下每个线程必须独立获取和管理自己的事务状态 - 不要在事务未结束前释放或丢弃
TransactionStatus引用,否则无法提交或回滚 - 避免在同一个事务中混用声明式(
@Transactional)和编程式控制,可能导致事务边界混乱 - 数据库连接、JDBC
Connection等底层资源由事务管理器自动绑定与解绑,无需手动处理
不复杂但容易忽略。


















