温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

自增主键会锁表吗

发布时间:2026-09-28 00:51:21 来源:亿速云 阅读:108 作者:小樊 栏目:数据库

简短结论:正常情况下,MySQL 的“自增主键(AUTO_INCREMENT)”本身不会锁整张表,但在某些场景和版本/配置下,可能会产生“自增相关的锁行为”,给人“像锁表”的感觉。

下面分情况说清楚。


一、最常见的情况(不会锁表)

在 InnoDB + 普通 INSERT 时:

INSERT INTO t(id, name) VALUES (NULL, 'a');
  • 自增 ID 的分配使用的是 轻量级锁(mutex / atomic)
  • 只是短暂保护“自增计数器”
  • 不会锁表,不会阻塞其他 INSERT

这是 MySQL 的默认行为(尤其是 5.1+,更明显是 5.7 / 8.0)


二、可能导致“看起来像锁表”的情况

1️⃣ innodb_autoinc_lock_mode = 0(传统模式)

这是唯一会“锁表”的自增模式。

  • 所有 INSERT 都会加 AUTO-INC 表级锁
  • 直到语句结束才释放
  • 并发 INSERT 会被串行化
SET GLOBAL innodb_autoinc_lock_mode = 0;

✅ 现在已经很不推荐
✅ MySQL 5.7 / 8.0 默认是 1 或 2


2️⃣ 批量 INSERT(某些历史版本)

例如:

INSERT INTO t SELECT * FROM other;

在老版本 + lock_mode=1 时:

  • 会预分配自增区间
  • 可能使用表级 AUTO-INC 锁

但在 MySQL 8.0 + lock_mode=2(interleaved):

  • 不会锁表
  • 并发插入安全

3️⃣ 显式指定自增主键(不相关但常混淆)

INSERT INTO t(id, name) VALUES (100, 'a');
  • 如果 id 很大或乱序
  • 可能导致 页分裂、锁争用
  • 但这是 索引锁/行锁问题,不是自增锁表

4️⃣ DDL 操作(真正锁表)

ALTER TABLE t AUTO_INCREMENT = 1000000;
  • 这是 DDL
  • InnoDB 会 锁表(或在线但有限制)
  • 和“自增是否锁表”不是一回事

三、MySQL 官方推荐的配置

✅ MySQL 5.7 / 8.0 默认

innodb_autoinc_lock_mode = 2

特点:

  • 不锁表
  • 高并发安全
  • 自增可能“不连续”(正常)

四、一句话总结

自增主键本身不会锁表;只有在老版本或 autoinc_lock_mode=0 时才会使用表级自增锁。

如果你愿意,可以告诉我:

  • MySQL 版本
  • 是否高并发写入
  • 是否遇到具体“卡住 / 等待”现象

我可以帮你精准判断是不是自增导致的。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手