Mysql自增锁(Auto-inc Locks)用法及说明

 更新时间:2025年12月30日 14:30:03   作者:赶路人儿  
自增锁是MySQL中用于控制自增值分配的机制,保证并发插入时不产生重复ID,MySQL 5.1引入了innodb_autoinc_lock_mode参数来控制自增锁模式,包括传统模式、连续模式和交错模式

当表中存在 AUTO_INCREMENT 列时,MySQL 在生成自增值的过程中,需要一种机制保证并发插入时不产生重复 ID,这就涉及 自增锁。

这个锁用于 控制自增值分配的顺序和唯一性,而不是保护整行数据。

自 MySQL 5.1 起支持通过参数innodb_autoinc_lock_mode来控制自增锁模式,常见值有 0 / 1 / 2。

#查看
SHOW VARIABLES LIKE 'innodb_autoinc_lock_mode';

#运行时设置
SET GLOBAL innodb_autoinc_lock_mode = 2;

#配置设置
[mysqld]
innodb_autoinc_lock_mode = 1

1、innode_autoinc_lock_mode=0(传统模式)

1)特点

  • 插入时使用 表级 AUTO-INC 锁,也就是说:如果一个事务正在往表中插入记录,所有其他事务的插入必须等待。
  • 串行生成自增 ID,锁一直持有到 语句结束

说这种模式下可以保证,一个事物内,一次insert插入多条,或多次insert插入数据的ID一定是连续的,不受其他事物影响(其他事物需要等待)。但是也无法保证整张表的ID都是连续的,因为存在回滚

2)问题

  • 并发插入性能差,容易成为瓶颈

3)易混淆点

innodb_autoinc_lock_mode = 0 只解决“并发插入顺序”问题,并不能解决“事务回滚回收自增 ID”的问题。

也就是说:

  • 同一事务内、多事务并发下,插入顺序是串行的
  • 回滚的自增 ID 不会被重用,所以事务回滚仍然会导致自增 ID 跳号。

所以,不要在代码中使用自增ID作为业务连续性的逻辑处理。

2、innode_autoinc_lock_mode=1(默认,连续模式)

性能和安全性这种,多数业务推荐使用。

1)特点

  • Simple INSERT:几乎不加表锁
  • Bulk / 非确定性 INSERT:仍使用 AUTO-INC 锁
  • 这种模式下可以支持:保证同一条语句内自增值连续(insert into table(a,b,c) values (), ()...)

什么是Simple INSERT?

#一下为Simple INSERT
INSERT INTO t(a) VALUES (1);
INSERT INTO t(a) VALUES (1),(2);

#非 Simple INSERT
INSERT INTO t(a) SELECT ...;
LOAD DATA INFILE ...

2)和AUTO-INC锁对比

上面介绍了,AUTO-INC模式下可以保证一个事物内的插入操作产生的ID是连续的;

而autonic_lock_mode=1这种模式下只能保证一个insert多次插入的ID是连续的。

因为,在这种模式下,AUTO_INCREMENT 的分配与事务提交无关,只与“INSERT 语句执行顺序”有关,所以同一个事务内多次 INSERT,也不能保证 ID 连续

看一个例子:

#1.事务A插入,但是不提交,插入后id=1
BEGIN;
INSERT INTO t(v) VALUES (1);

#2.事务B插入,并提交,此时id=2
BEGIN;
INSERT INTO t(v) VALUES (2);
COMMIT;

#3.事务A继续插入,插入后id=3
INSERT INTO t(v) VALUES (3);

#4.这时在事务A中插叙,发现id为1和3
SELECT id, v FROM t;

可以看到,因为没有了锁,ID自增器类似于一个发号器,每个insert都从这里取号。

3、innode_autoinc_lock_mode=2(交错模式/无锁模式)

1)特点

  • 完全不使用 AUTO-INC 表锁,多线程并发性能最好
  • 自增值只保证唯一,不保证连续

这种模式下,即使同一条 INSERT 内 ID 可能不连续,即:出现跳号。

2)例子

#线程A
INSERT INTO t(a) VALUES (1),(2);

#线程B
INSERT INTO t(a) VALUES (3),(4);

#查询结果
实际 ID 可能交错:1,3,2,4

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 深入解析MySQL中的约束

    深入解析MySQL中的约束

    约束是关系型数据库的一个重要的功能,主要作用是保证数据的完整性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正常),本文给大家介绍MySQL中的约束,感兴趣的朋友一起看看吧
    2025-10-10
  • MySQL获取系统性能和状态代码

    MySQL获取系统性能和状态代码

    使用MySQL获取系统性能和状态的代码片段,由此需求的朋友可以参考下,希望对大家有所帮助
    2013-07-07
  • 修改Innodb的数据页大小以优化MySQL的方法

    修改Innodb的数据页大小以优化MySQL的方法

    这篇文章主要介绍了修改Innodb的数据页大小以优化MySQL的方法,Innodb是MySQL下一个颇具人气的数据引擎,需要的朋友可以参考下
    2015-05-05
  • MySQL底层文件的查看和修改方法

    MySQL底层文件的查看和修改方法

    MySQL 底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以 Linux 环境为例,需要的朋友可以参考下
    2025-12-12
  • MySQL删除表数据、清空表的实现过程

    MySQL删除表数据、清空表的实现过程

    这篇文章主要介绍了MySQL删除表数据、清空表的实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10
  • mysql中全连接full join...on...的用法说明

    mysql中全连接full join...on...的用法说明

    这篇文章主要介绍了mysql中全连接full join...on...的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MySQL频繁更新热点数据高并发场景下的具体解决方案

    MySQL频繁更新热点数据高并发场景下的具体解决方案

    本文详细介绍了MySQL高频更新热点数据在高并发场景下的解决方案,包括应用层缓存、数据分片、队列削峰、数据库层面优化(如CAS、调整事务隔离级别)、读写分离、请求合并、参数调优、分布式计数器等方法,需要的朋友可以参考下
    2025-10-10
  • 实现mysql级联复制的方法示例

    实现mysql级联复制的方法示例

    这篇文章主要介绍了实现mysql级联复制的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • MySQL实现列字符集转换避免乱码的终极指南

    MySQL实现列字符集转换避免乱码的终极指南

    字符集是一个系统支持的所有抽象字符的集合,字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等,为了避免乱码,通常将列字符集转换,所以本文给大家介绍了转换的终极指南,需要的朋友可以参考下
    2025-10-10
  • Ubuntu 14.04下安装MySQL

    Ubuntu 14.04下安装MySQL

    1、更新源列表打开"终端窗口",输入"sudo apt-getupdate"-->回车-->"输入root用户的密码"-->回车,就可以了。如果不运行该命令,直接安装mysql,会出现"有几个软件包无法下载,您可以运行apt-getupdate------"的错误提示,导致无法安装。
    2016-04-04

最新评论