简短结论:正常情况下,MySQL 的“自增主键(AUTO_INCREMENT)”本身不会锁整张表,但在某些场景和版本/配置下,可能会产生“自增相关的锁行为”,给人“像锁表”的感觉。
下面分情况说清楚。
在 InnoDB + 普通 INSERT 时:
INSERT INTO t(id, name) VALUES (NULL, 'a');
这是 MySQL 的默认行为(尤其是 5.1+,更明显是 5.7 / 8.0)
innodb_autoinc_lock_mode = 0(传统模式)这是唯一会“锁表”的自增模式。
SET GLOBAL innodb_autoinc_lock_mode = 0;
✅ 现在已经很不推荐
✅ MySQL 5.7 / 8.0 默认是 1 或 2
例如:
INSERT INTO t SELECT * FROM other;
在老版本 + lock_mode=1 时:
但在 MySQL 8.0 + lock_mode=2(interleaved):
INSERT INTO t(id, name) VALUES (100, 'a');
ALTER TABLE t AUTO_INCREMENT = 1000000;
✅ MySQL 5.7 / 8.0 默认
innodb_autoinc_lock_mode = 2
特点:
自增主键本身不会锁表;只有在老版本或
autoinc_lock_mode=0时才会使用表级自增锁。
如果你愿意,可以告诉我:
我可以帮你精准判断是不是自增导致的。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。