MySQL 8.0.31自增ID出现大量间隔问题求助
MySQL 8.0.31自增主键大量间隔问题
我们在MySQL 8.0.31版本的多张表中发现自增主键存在大量间隔(默认innodb_autoinc_lock_mode=2“交错锁模式”,已知该模式会产生小间隔)。涉及order(id为bigint)和order_line_items(id为bigint)表:
TABLE_NAME | CURRENT AUTO_INCREMENT | TABLE ROW COUNT order | 27504 | 1367 order_line_items | 430930 | 34970
order表共1367条数据,但当前自增值为27504;order_line_items表34970条数据,自增值为430930。我们在同一场API调用的事务中保存这两张表的数据,事务可能因错误回滚。
间隔情况
order表的ID间隔持续了1-2天,目前已恢复连续递增。间隔呈集群式出现,详情如下:
Order table gap details: id | difference from previous 'id' ------------------------------------- 27489 1 27488 1 27487 1 27486 232 27254 232 27022 693 26329 240 26089 401 25688 175 25513 348 25165 864 24301 7656 16645 1709 14936 184 14752 13 14739 541 14198 82 14116 215 13901 68 13833 117 13716 140 .... 1468 1 1467 10 1457 1 1456 1 1455 1 1454 9 1445 1 1444 1 1443 1 1442 1 1441 1
观察结果
- 使用OpenJPA的
@Id, @GeneratedValue(strategy = GenerationType.IDENTITY)配置生成ID,代码中未手动设置ID。 - 其他表也存在相同模式;用20线程并行测试API,未出现类似大量间隔。
order表ID到1445(对应1225条数据)前无大间隔,之后1-2天内出现多次大幅跳跃,直至27487。- 已知事务回滚会提升自增值,但如此大的间隔与总数据量不符,无法理解。
问题
- 该现象的原因是什么?为何
order表仅1367条数据,ID却出现数千的跳跃(如7656、1709)? - 间隔呈集群式出现后又恢复连续递增,是否与MySQL内部处理有关?是否为MySQL的bug?
- 哪些操作会导致MySQL自增值大幅跳跃(如批量插入、共享锁)?如何在本地模拟该问题?
更新
经排查,客户端意外重试API导致多次失败的API调用,是引发ID大量间隔的原因。感谢各位帮助。
内容的提问来源于stack exchange,提问作者DarkKnight
相关产品推荐
相关产品推荐

