SQL应用避免重复条目:双机运行时Unique_ID重复该如何解决?
是否属于连接问题
该问题不属于连接问题,本质是分布式部署场景下无全局同步的自增ID生成逻辑缺陷:你当前的ID生成逻辑应该是在单台机器本地维护自增计数,两台机器没有共享计数状态,同时触发ID生成时自然会拿到相同的序列值,属于分布式系统常见的ID唯一性设计问题,和网络连接无关。
最优解决方案
按你的业务规模可以选择对应成本最低的方案:
- 低并发场景(单台数据库可扛住ID生成请求量):使用统一数据库的自增主键做全局序列
单独创建一张仅含自增主键字段的序列表,每次生成ID时先往该表插入一条空记录,拿到返回的自增主键值后格式化为U%05d的样式即可。关系型数据库的自增主键天然保证全局唯一,即使多台机器同时写入也不会返回重复值,实现成本极低,适合日均ID生成量在百万级以下的场景。 - 中高并发场景(不想每次生成ID都访问数据库):使用号段预分配方案
每台应用实例启动时,先从数据库一次性申请一个连续的ID号段,例如机器A分配11000、机器B分配10012000,各自在本地消耗号段内的序列值,号段用尽后再向数据库申请新的号段。该方案既保证ID全局唯一,又把ID生成的性能提升到本地内存计算的级别,适合日均ID生成量千万级的场景。 - 高并发多节点扩容场景:使用改造版雪花算法
给每台应用实例分配全局唯一的10位机器标识,生成的64位ID由时间戳、机器标识、本地序列号三部分组成,完全在本地生成无需依赖外部组件,天然保证全局唯一,生成后可以按需转换为你需要的带U前缀的字符串格式,适合未来还要扩容更多应用节点的高并发场景。
紧急修复建议:先在存储Unique_ID的数据库表对应字段添加唯一索引,重复ID写入时会直接报错,先避免脏数据进入业务系统,再逐步迭代ID生成逻辑。
内容的提问来源于stack exchange,提问作者JoeBackstab
相关产品推荐
相关产品推荐

