两个测试类各自带 @Sql 清表,并行跑起来 A 类刚插的三条订单被 B 类的 truncate 清掉,报 Expected 3 but was 0。串行跑从来不出现。日志里能对上时间点,这种反而好排。

清表语句作用在同一张物理表上,没有按 schema 隔离。两个类都以为自己是唯一使用者,执行时序一交错就互相踩。这一点先确认清楚,后面就不用反复试。

spring.datasource.url=jdbc:mysql://localhost:3306/test_${random.uuid}
mvn test -DforkCount=2

「测试库并发清表」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:每个测试类用独立 schema 或独立库名 由连接串区分;确实要共库就把清表范围收窄到本次插入的主键;并行执行时给清表加锁 或把两个类放同一执行组;核对 forkCount 避免多个 JVM 写同一张表。

结果对不对很好判断,并行跑二十轮不再出现 Expected 3 but was 0 两个类的数据各自完整。

作者 9823189