声明式事务需三步:开启@enabletransactionmanagement支持、配置platformtransactionmanager bean、在public方法或类上加@transactional注解;它通过aop自动管理事务,不侵入业务代码。

声明式事务通过注解配置,核心就三步:开启支持、定义事务管理器、在方法或类上加 @Transactional。它不侵入业务代码,由 Spring 自动拦截并管理事务生命周期。
必须开启注解驱动支持
Spring 默认不扫描 @Transactional 注解,需显式启用:
- 在 Java 配置类上添加 @EnableTransactionManagement(推荐)
- 或在 XML 配置中加入
<annotation-driven transaction-manager="transactionManager"></annotation-driven>
该注解会触发 Spring 加载事务相关的 AOP 基础设施,是整个机制生效的前提。
提供一个可用的事务管理器 Bean
Spring 需要知道用哪个管理器来控制事务,常见的是 JDBC 场景下的 DataSourceTransactionManager:
- 必须声明为 @Bean,且类型为 PlatformTransactionManager
- 构造时传入已配置好的 DataSource
- Bean 名称建议为
transactionManager,这样即使不显式指定也能被自动识别
示例:
@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Transactional 注解的正确使用方式
该注解作用于 public 方法或类,不能用于 private/protected 方法,也不支持内部方法自调用:
- 标注在 类上:该类所有 public 方法默认启用事务(可被子类继承)
- 标注在 方法上:仅该方法受事务控制;若类和方法都标注,方法级属性会覆盖类级
- 默认只对 RuntimeException 和 Error 回滚;如需对受检异常(如 SQLException)也回滚,需显式设置
rollbackFor = SQLException.class - 事务传播行为默认是 REQUIRED,即有事务则加入,无则新建
常见配置项说明
@Transactional 支持多个属性,按常用程度排序:
- propagation:控制事务如何传播,如 REQUIRES_NEW 强制新建事务
- isolation:指定隔离级别,如 READ_COMMITTED(避免脏读)
- readOnly:设为 true 可提升只读查询性能,部分数据库会做优化
- timeout:单位秒,超时自动回滚,防止长事务占用资源
- rollbackFor / noRollbackFor:精确控制哪些异常触发或不触发回滚
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











