0

0

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

冷炫風刃

冷炫風刃

发布时间:2025-12-19 22:26:02

|

657人浏览过

|

来源于php中文网

原创

雪花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就完事”,实际使用中这几个点常被忽略:

ToonMe
ToonMe

一款风靡Instagram的软件,一键生成卡通头像

下载
  • 机器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生成。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

321

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

676

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

417

2024.04.29

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 801人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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