☰
自增锁中的innodb_autoinc_lock_mode参数
2026/10/14 12:18:37 网站建设 项目流程

先搞懂两个关键概念

1. INSERT-LIKE(所有插入类语句)
只要是要往表里塞数据的语句都算,比如:

INSERT

REPLACE

INSERT ... SELECT

LOAD DATA

2. 两类插入语句的区别

Simple inserts(简单插入):插之前就知道要插几行,比如 INSERT INTO t VALUES (1),(2),(3),一看就知道要 3 个数据。
Bulk inserts(批量插入):插之前不知道要插几行,比如 INSERT INTO t SELECT * FROM big_table,得一边查一边插,查出来多少行事先不知道。

模式 0:传统锁模式

规则:所有插入语句,都直接给整张表上一把大锁(AUTO_INC 表级锁)。

通俗解释:
银行只有一个取号机,而且这个取号机被一把大锁锁着,谁要取号,谁就得把整个银行大厅的门锁上,自己取完号、插完数据,语句一执行完就立刻开门,让下一个人进来。

特点:
锁是在语句执行完就释放,不是等整个事务提交才释放。
同一时刻,一张表只能有一个人在插数据,并发能力最差。但好处是:自增 ID 一定是连续的,不会跳号。

模式 1:连续锁模式

这是 MySQL 5.7 / 8.0 的默认值。

对 Simple inserts(知道插几行):

不用表级大锁,只用一把轻量级的小锁(互斥量)。

因为知道要插几行,所以可以一次性把需要的号全部分配好,分完立刻放锁。

相当于:你进银行前就知道自己要办 3 笔业务,取号机立即给你 3 个连号,然后你拿着号去旁边慢慢办,不占着取号机。

对 Bulk inserts(不知道插几行):
还是得用表级大锁,一直锁到语句执行完。
因为不知道要多少号,只能一边插一边取号,怕别人插队导致号乱,所以干脆锁住整张表。

特点:
大部分日常 INSERT 并发很好。
自增 ID 在单条语句内是连续的,但多条语句之间可能有空洞(因为事务回滚等原因)。
这是兼顾并发和安全的最佳平衡,所以是默认值。

模式 2:交错锁模式(并发最高,但 ID 可能不连续)

规则:所有插入语句,**都不再用表级大锁**,全部只用轻量级互斥锁。

通俗解释:
银行开了很多个取号窗口,大家各取各的号,互不干扰。

特点:
并发性能最高,很多线程可以同时插数据。
但代价是:自增 ID 可能不连续,甚至同一条语句里的 ID 都可能是交错跳号的。
比如一条 INSERT ... SELECT 插了 100 行,ID 可能是 1、3、5、7…… 中间被别人抢走了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询