mybatis-plus自动生成主键ID重复原因

哈喽,大家好,我是了不起。

国内很多软件都使用Mybatis-plus,同时也会使用到其生成ID的算法。

最近遇到了同一服务在并发的情况下不同实例自动生成的id相同的问题。

问题原因

  1. 时钟回拨(最常见原因)
    • 服务器时间被手动调整或NTP同步导致时间倒退
    • 雪花算法严重依赖系统时钟,回拨会导致生成重复ID
  2. WorkerID 分配冲突
    • 分布式环境中多个实例使用了相同的 workerId/datacenterId
    • MyBatis-Plus 默认使用 DefaultIdentifierGenerator,workerId 默认取0
  3. 并发量超过算法限制
    • 单个实例1ms内生成ID超过4096个(序列号耗尽)
    • 默认配置:1位符号位 + 41位时间戳 + 10位机器ID + 12位序列号
  4. 虚拟机快照恢复
    • 使用虚拟机快照回滚后时间倒流但workerId未变
Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。