首页 > 数据库 > SQL > 正文

SQL并发插入如何避免主键冲突_雪花ID思路解析【指导】

冷炫風刃
发布: 2025-12-19 22:26:02
原创
657人浏览过
雪花ID能从源头避免SQL并发插入主键冲突,因其是全局唯一、时间有序、无中心协调的64位整数,不依赖数据库自增或锁表;而自增主键在高并发下因写锁争抢易导致阻塞、重复或跳号,分布式环境更失效;雪花ID由时间戳、机器ID、序列号组成,只要机器ID唯一且时钟不回拨即绝对不冲突;应用层生成、无需DB参与、自带时序性、兼容主流数据库大整型;落地需注意机器ID全局唯一、时钟回拨兜底、字段类型必须用BIGINT或DECIMAL(20,0);插入语句无需加锁或重试,冲突概率趋近于零。

sql并发插入如何避免主键冲突_雪花id思路解析【指导】

用雪花ID(Snowflake ID)做主键,能从源头避免SQL并发插入时的主键冲突,关键在于它生成的是全局唯一、时间有序、无中心协调的64位整数,不依赖数据库自增或锁表。

为什么自增主键在并发下容易冲突

传统 AUTO_INCREMENT 依赖数据库写锁保证顺序,高并发插入时多个事务争抢同一自增值,轻则等待阻塞,重则因事务回滚或批量插入逻辑缺陷导致重复值或跳号;分布式环境下多个数据库实例更无法共享自增序列,直接失效。

雪花ID如何天然规避冲突

雪花ID由4部分组成:1位符号位(固定0)+ 41位毫秒时间戳 + 10位机器ID(含数据中心ID)+ 12位序列号。同一毫秒内,靠机器ID和序列号组合确保不重复;不同毫秒天然错开。只要机器ID不重复、时钟不回拨,就绝对不冲突。

  • 无需数据库参与ID生成,应用层直接产出,彻底脱离DB锁
  • 时间戳前置,ID本身自带时序性,适合做分库分表的路由键或查询排序
  • 64位整数,兼容MySQL BIGINT、PostgreSQL BIGINT、Oracle NUMBER(19)等主流类型

落地时必须注意的3个细节

雪花ID不是“引入一个SDK就完事”,实际使用中这几个点常被忽略:

AI发型设计
AI发型设计

虚拟发型试穿工具和发型模拟器

AI发型设计 247
查看详情 AI发型设计
  • 机器ID必须全局唯一:不能所有服务实例都用默认值0。建议通过配置中心分配,或结合K8s StatefulSet序号、Consul节点标签等方式动态生成
  • 时钟回拨要兜底:如果服务器时间向后跳(如NTP校准),可能导致ID重复。生产环境需启用等待策略(如暂停生成直到追平时间)或降级为UUID
  • 数据库字段类型要匹配:别用INT或UNSIGNED INT存雪花ID(最大只到42亿,而雪花ID可达9千亿),必须用BIGINT(有符号)或DECIMAL(20,0)

插入语句无需额外加锁或重试

因为ID已在应用层生成且唯一,SQL插入变成标准的单条写入:

INSERT INTO order (id, user_id, amount) VALUES (912345678901234567, 1001, 99.9);

不用SELECT ... FOR UPDATE查是否存在,不用ON DUPLICATE KEY UPDATE,也不用REPLACE INTO。冲突概率趋近于零,吞吐量直接受益于去中心化ID生成。

以上就是SQL并发插入如何避免主键冲突_雪花ID思路解析【指导】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号