java事务配置需正确理解传播行为、隔离级别、回滚策略及底层机制,显式配置platformtransactionmanager,@transactional仅对public方法生效,避免self-invocation、异步脱离上下文等陷阱,并通过日志和数据库验证实效性。

Java 事务配置不是套个注解就完事,关键在理解传播行为、隔离级别、回滚策略和底层机制的配合。配错一处,就可能出现脏读、事务不生效、嵌套失效或连接泄漏。
事务管理器必须显式配置
Spring 默认不启用事务,@Transactional 不会自动生效。你需要声明一个 PlatformTransactionManager 实现(如 DataSourceTransactionManager),并确保它被 Spring 容器识别:
- 基于 JDBC:注入 DataSource,用 DataSourceTransactionManager
- 使用 JPA:用 JpaTransactionManager,且需关联 EntityManagerFactory
- 多数据源场景:每个事务管理器需命名(如 @Qualifier("orderTxManager")),并在 @Transactional 中指定 transactionManager 属性
@Transactional 注解要写对位置和参数
只对 public 方法生效;类内部 self-invocation(自己调自己)会绕过代理,事务失效。常用配置项必须按需设准:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- propagation:默认 REQUIRED,但方法可能需要 REQUIRES_NEW(如日志记录独立提交)、NESTED(保存点回滚)或 SUPPORTS(只读查询不开启事务)
- isolation:默认 ISOLATION_DEFAULT(由数据库决定),高并发下可显式设为 READ_COMMITTED 防脏读
- rollbackFor:默认只对 RuntimeException 和 Error 回滚,检查异常(如 SQLException)需手动指定 rollbackFor = Exception.class
- readOnly:设为 true 可触发 JDBC 的只读连接优化,但仅当数据库支持且事务真正只读时才启用
事务边界与资源生命周期要对齐
事务控制的是数据库连接的生命周期,不是业务逻辑块。常见陷阱:
- 不要在事务方法里手动 close() Connection/Statement —— 交给 Spring 管理
- 异步操作(@Async)默认脱离事务上下文,需用 TransactionTemplate 或手动传播 TransactionSynchronizationManager
- 流式处理(如 Stream.iterate + forEach)若含数据库操作,需确保整个链路在同一个事务内,避免提前提交或连接复用混乱
验证事务是否真生效
光看代码没用,得用实际手段验证:
- 开启 Spring 日志:logging.level.org.springframework.transaction=DEBUG,观察 “Creating new transaction”、“Initiating transaction rollback”
- 故意抛异常,查数据库是否回滚;再用 try-catch 吞掉异常,确认未回滚
- 用数据库监控工具(如 MySQL 的 SHOW ENGINE INNODB STATUS)查当前活跃事务和锁等待
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










