Spring Boot的事务管理注解@EnableTransactionManagement的使用

本文介绍了Spring Boot使用事务的方法,开启事务支持后在Service方法添加注解即可。还说明了不同持久化依赖下框架默认注入的事务管理器,可通过方法Debug测试。项目较大时可人为指定事务管理器,同时讲解了多事务管理器的处理及相关注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。

关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。

你可以在启动类中添加如下方法,Debug测试,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类。

@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@SpringBootApplication
public class ProfiledemoApplication {
 
    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager){
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
        return new Object();
    }
 
    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
}

这些SpringBoot为我们自动做了,这些对我们并不透明,如果你项目做的比较大,添加的持久化依赖比较多,我们还是会选择人为的指定使用哪个事务管理器。 
代码如下:

@EnableTransactionManagement
@SpringBootApplication
public class ProfiledemoApplication {
 
    // 其中 dataSource 框架会自动为我们注入
    @Bean
    public PlatformTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager) {
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
        return new Object();
    }
 
    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
}

在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。

然后在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。

对于同一个工程中存在多个事务管理器要怎么处理,请看下面的实例,具体说明请看代码中的注释。

@EnableTransactionManagement // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />
@SpringBootApplication
public class ProfiledemoApplication implements TransactionManagementConfigurer {
 
    @Resource(name="txManager2")
    private PlatformTransactionManager txManager2;
 
    // 创建事务管理器1
    @Bean(name = "txManager1")
    public PlatformTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    // 创建事务管理器2
    @Bean(name = "txManager2")
    public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
        return new JpaTransactionManager(factory);
    }
 
    // 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return txManager2;
    }
 
    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
 
}

注: 
如果Spring容器中存在多个 PlatformTransactionManager 实例,并且没有实现接口 TransactionManagementConfigurer 指定默认值,在我们在方法上使用注解 @Transactional 的时候,就必须要用value指定,如果不指定,则会抛出异常。

对于系统需要提供默认事务管理的情况下,实现接口 TransactionManagementConfigurer 指定。

对有的系统,为了避免不必要的问题,在业务中必须要明确指定 @Transactional 的 value 值的情况下。不建议实现接口 TransactionManagementConfigurer,这样控制台会明确抛出异常,开发人员就不会忘记主动指定。

 

 

 

<think>好的,用户的问题是关于Spring Boot的@SpringBootApplication注解是否默认包含@EnableTransactionManagement功能。首先,我需要回忆Spring Boot的自动配置机制。记得Spring Boot通过@EnableAutoConfiguration来自动配置各种功能,包括事务管理。然后,@SpringBootApplication是一个组合注解,包含@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。 接下来,我需要确认事务管理的自动配置是否默认启用。根据引用[3]中的内容,@EnableTransactionManagementSpring Boot中通常不需要显式添加,因为自动配置已经处理了事务管理。当项目中存在相关依赖(如spring-boot-starter-data-jpa或spring-boot-starter-jdbc)时,Spring Boot会自动配置事务管理器,并启用@Transactional的支持,无需手动添加@EnableTransactionManagement。 然后,我需要验证用户提供的引用内容。引用[3]指出,在Spring Boot项目中,通常不需要在启动类上添加@EnableTransactionManagement,因为它已经通过自动配置生效。这支持了我的观点。而引用[2]中的代码示例显示用户手动添加了@EnableTransactionManagement,但实际上这可能是不必要的,除非有特殊的配置需求。 此外,我需要考虑用户可能的误解来源。用户可能在旧的Spring项目中习惯显式启用事务,但Spring Boot简化了这一步骤。因此,用户的问题可能源于对自动配置机制的不熟悉,需要明确说明Spring Boot的默认行为。 总结来说,@SpringBootApplication并不直接包含@EnableTransactionManagement注解,但由于自动配置的存在,事务管理功能在满足条件时会自动启用。因此,用户无需手动添加该注解,除非需要覆盖默认配置。</think>关于@SpringBootApplication是否默认包含@EnableTransactionManagement功能的解答如下: 1. **注解关系解析** @SpringBootApplication是组合注解,包含三个核心注解: - @SpringBootConfiguration(标记为配置类) - @EnableAutoConfiguration(启用自动配置) - @ComponentScan(组件扫描) 其中**不包含@EnableTransactionManagement**的直接声明[^2][^3]。 2. **事务自动配置机制** Spring Boot通过自动配置类`TransactionAutoConfiguration`实现: - 当classpath中存在`PlatformTransactionManager`实现类时(如引入JDBC或JPA依赖) - 自动注册事务管理器并启用注解驱动的事务管理 - 等同于隐式启用了@EnableTransactionManagement功能 3. **验证方式** 可通过以下代码验证事务管理器是否自动注入: ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean public void printTransactionManager(PlatformTransactionManager tm) { System.out.println("当前事务管理器:" + tm.getClass().getName()); } } ``` 输出结果将显示具体的事务管理器实现类(如DataSourceTransactionManager) 4. **显式声明场景** 需要手动添加@EnableTransactionManagement的情况: - 使用Spring Boot默认的事务管理器 - 需要自定义事务拦截顺序 - 多数据源场景下的特殊配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值