Spring Boot Test事务不回滚问题(MS SQL Server,Spring Boot 2.7.5)
问题根源
多数据源配置时,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

