You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Test事务不回滚问题(MS SQL Server,Spring Boot 2.7.5)

多数据源场景下@Transactional测试不回滚的解决办法

问题根源

多数据源配置时,Spring默认的事务管理器没和你的自定义数据源绑定,导致@Transactional注解完全起不到作用,测试插入的数据直接持久化到数据库里了。

具体修复步骤

1. 给@Transactional指定明确的事务管理器

因为是多数据源,你得在测试类的@Transactional注解里指定对应数据源的事务管理器Bean名称——就是你配置数据源时定义的那个事务管理器Bean的名字,比如primaryTransactionManager或者你自己取的其他名字:

@Transactional(value = "yourCustomTransactionManager")
@Rollback
public class MyIT {
    // ... 测试代码
}

2. 检查数据源与事务管理器的绑定配置

确保每个数据源都对应配置了PlatformTransactionManager,并且你的仓库接口绑定了正确的事务管理器。举个配置例子:

@Configuration
public class DataSourceConfig {
    @Bean
    @Primary
    public DataSource primaryDataSource() {
        // 这里写主数据源的配置逻辑
    }

    @Bean(name = "primaryTransactionManager")
    public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public DataSource secondaryDataSource() {
        // 这里写次数据源的配置逻辑
    }

    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

然后在你的仓库接口上指定对应的事务管理器:

@Repository
@Transactional(value = "primaryTransactionManager")
public interface ChannelRepository extends JpaRepository<Channel, Long> {
}

3. 排查事务传播属性问题

确认测试方法没有被其他非事务方法包裹,或者仓库方法的事务传播属性被修改过。默认的@Transactional传播行为是REQUIRED,如果你的仓库方法用了其他传播属性(比如SUPPORTS),可能会导致事务不生效。

4. 检查SQL Server的连接配置

确保你的SQL Server测试库的连接没有开启自动提交——如果连接配置了autoCommit=true,每个DB操作都会自动提交,事务自然回滚不了。去application.yml里检查数据源配置:

spring:
  datasource:
    your-datasource-id:
      url: jdbc:sqlserver://xxx;databaseName=xxx
      username: xxx
      password: xxx
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
      hikari:
        auto-commit: false # 必须把自动提交关掉

5. 排查配置冲突

虽然@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)主要是用来禁用嵌入式数据库替换,但也可以检查下它是否和其他测试配置有冲突,比如有没有其他配置类覆盖了事务管理逻辑。

验证方式

修改完配置后重新跑测试,然后手动查数据库看测试数据有没有被回滚。如果还是不行,可以开启Spring事务日志来排查细节:

logging:
  level:
    org.springframework.transaction: DEBUG
    org.springframework.orm.jpa: DEBUG

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:10:24