You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot中@Transactional指定隔离级别与传播行为触发事务未初始化警告排查

问题分析与解决方案

哈哈,这个问题我之前踩过一模一样的坑!咱们来一步步拆解原因:

核心原因:缺少事务管理器

你收到的警告Custom isolation level specified but no actual transaction initiated本质上是因为Spring没有找到可用的事务管理器,导致@Transactional注解完全没生效,自然不会为你的方法创建事务边界。而数据库查询能正常执行,是因为普通的JDBC查询本身不需要事务也能跑起来。

为什么会没有事务管理器?看你的启动类代码就找到了:

@SpringBootApplication(scanBasePackages= {"com.mytest.txntest"}) 
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 
public class Application { 
    public static void main( String[] args ) { 
        SpringApplication.run(Application.class, args); 
    } 
}

你排除了DataSourceAutoConfiguration,这会让Spring自动配置的数据源、事务管理器(默认是DataSourceTransactionManager)都无法被创建。没有事务管理器,Spring根本不知道该怎么处理@Transactional注解,所以只会输出警告,不会启动事务。

解决方案

根据你的需求,有两种处理方式:

方案1:去掉数据源自动配置的排除(推荐)

如果你的项目不需要自定义数据源,只是用Spring Boot的默认配置,直接删掉exclude={DataSourceAutoConfiguration.class}这行,然后在application.propertiesapplication.yml里配置好数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/your_db
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

这样Spring会自动帮你创建数据源和对应的事务管理器,@Transactional注解就能正常生效,警告也会消失。

方案2:手动配置事务管理器(如果必须自定义数据源)

如果你确实需要排除自动配置、自己定义数据源,那一定要手动创建事务管理器Bean,让Spring能识别事务:

@Configuration
// 别忘了加这个注解启用事务管理
@EnableTransactionManagement
public class CustomDataSourceConfig {

    // 自定义数据源
    @Bean
    public DataSource customDataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/your_db");
        dataSource.setUsername("your_username");
        dataSource.setPassword("your_password");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return dataSource;
    }

    // 配置事务管理器,注入自定义数据源
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

配置完之后,Spring就能通过这个事务管理器处理@Transactional注解,你的方法就会被纳入事务边界了。

额外检查点

如果上面的方案还没解决,你可以再检查下@Transactionalpropagation属性:

  • 如果你设置了PROPAGATION_SUPPORTS(默认是REQUIRED),当当前没有事务时,不会主动创建新事务,也会触发这个警告
  • 确保你的方法不是private的,Spring的AOP代理无法拦截private方法,@Transactional也会失效

内容的提问来源于stack exchange,提问作者springbootlearner

火山引擎 最新活动