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

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。
  • 已知事务回滚会提升自增值,但如此大的间隔与总数据量不符,无法理解。

问题

  1. 该现象的原因是什么?为何order表仅1367条数据,ID却出现数千的跳跃(如7656、1709)?
  2. 间隔呈集群式出现后又恢复连续递增,是否与MySQL内部处理有关?是否为MySQL的bug?
  3. 哪些操作会导致MySQL自增值大幅跳跃(如批量插入、共享锁)?如何在本地模拟该问题?

更新

经排查,客户端意外重试API导致多次失败的API调用,是引发ID大量间隔的原因。感谢各位帮助。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:40:25