Quarkus @TestTransaction不生效 测试后数据库数据未回滚
Quarkus单元测试@TestTransaction不自动回滚的原因与修复方案
常见触发原因
- 注解导包错误:误导入Spring测试包或其他非Quarkus包下的
@TestTransaction注解,Quarkus无法识别第三方包下的同名注解,不会织入事务回滚逻辑。 - 数据库操作脱离测试事务边界:
- 被测试的
consumeJiraChange方法或DAO层写库方法配置了@Transactional(REQUIRES_NEW)事务传播级别,会独立开启新事务,方法执行完就直接提交,完全不受外层测试方法的事务管控,提交的数据不会随测试事务回滚。 - 写库逻辑在异步线程中执行:比如方法加了
@Asynchronous注解、内部自定义线程池处理落库、走消息中间件异步消费,异步线程的事务上下文和测试主线程绑定的测试事务完全隔离,异步写操作会在独立事务中提交,不会被回滚。
- 被测试的
- 依赖或版本兼容问题:
- 项目未正确引入
quarkus-junit5及对应持久层扩展依赖,测试事务拦截器未被加载。 - Quarkus 2.10.0版本对响应式Hibernate/响应式SQL客户端的
@TestTransaction支持存在已知bug,部分场景下不会触发回滚逻辑。
- 项目未正确引入
- 存储层不支持事务:比如使用MySQL MyISAM引擎建表,本身不支持事务特性,所有写入操作会直接持久化,事务回滚不生效。
对应修复方式
- 修正注解导包,确保导入Quarkus官方提供的测试事务注解,删除其他包下的同名注解导入:
import io.quarkus.test.TestTransaction; - 调整事务边界,确保所有测试过程中的写操作都处于测试事务管控范围内:
- 检查被测试类、DAO类的事务传播配置,测试场景下将写操作方法的事务传播级别改为默认的
REQUIRED,让方法加入测试方法开启的外层事务,随测试结束统一回滚。如果生产环境必须使用REQUIRES_NEW级别,可以在测试目录下编写测试专用的替代Bean,覆盖原有的新事务配置。 - 如果存在异步写库逻辑,测试中调用后要阻塞等待所有异步逻辑执行完成,或者临时将测试调用的方法改为同步执行,避免写操作跑到和测试事务隔离的异步线程中。
- 检查被测试类、DAO类的事务传播配置,测试场景下将写操作方法的事务传播级别改为默认的
- 校验依赖与版本:
- 确保测试模块正确引入了
quarkus-junit5依赖,使用响应式栈的场景下建议将Quarkus 2.10.0升级到2.13.x及以上的2.x稳定版本,修复响应式测试事务不回滚的已知问题。 - 可以在注解上显式指定回滚参数,排除全局配置覆盖默认值的问题:
@TestTransaction(rollback = true)
- 确保测试模块正确引入了
- 检查测试库配置:MySQL/MariaDB场景下确认测试用表使用InnoDB等支持事务的存储引擎,不要使用MyISAM等无事务支持的引擎。
内容的提问来源于stack exchange,提问作者Gubber
相关产品推荐
相关产品推荐

