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数据库创建账号、授权、数据导出、导入操作,结合实例形式分析了MySQL数据库账号创建、权限控制、数据导入导出等具体实现方法与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • mysql制作外键出现duplicate key name错误问题及解决

    mysql制作外键出现duplicate key name错误问题及解决

    这篇文章主要介绍了mysql制作外键出现duplicate key name错误问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • sql模式设置引起的问题解决办法

    sql模式设置引起的问题解决办法

    这篇文章主要介绍了sql模式设置引起的问题解决办法,文章围绕主题展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • mysql数据库重命名语句分享

    mysql数据库重命名语句分享

    这篇文章主要介绍了mysql数据库重命名语句救命示例,语句中的数据库表前缀换成自己的就可以了,大家参考使用吧
    2014-01-01
  • MySQL数据库事务隔离级别详解

    MySQL数据库事务隔离级别详解

    这篇文章主要介绍了MySQL数据库事务隔离级别详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • mysql 事务处理及表锁定深入简析

    mysql 事务处理及表锁定深入简析

    本文将详细介绍mysql 事务处理及表锁定,需要了解更多的朋友可以参考下
    2012-11-11
  • MySQL中关于表的约束

    MySQL中关于表的约束

    在MySQL中,约束用于定义表的规则和限制,确保数据的准确性和可靠性,主要类型包括NOT NULL、DEFAULT、PRIMARY KEY、AUTO_INCREMENT、UNIQUE KEY、FOREIGN KEY、CHECK和INDEX等,NOT NULL约束确保列不能存储NULL值;DEFAULT设置默认值
    2024-09-09
  • MySQL索引优化之分页探索详细介绍

    MySQL索引优化之分页探索详细介绍

    大家好,本篇文章主要讲的是MySQL索引优化之分页探索详细介绍,感兴趣的同学赶快来看看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • MyCat环境搭建详细教程

    MyCat环境搭建详细教程

    这篇文章主要介绍了MyCat环境搭建详细教程的相关资料,需要的朋友可以参考下
    2022-11-11
  • MySQL GRANT用户授权的实现

    MySQL GRANT用户授权的实现

    授权就是为某个用户赋予某些权限。MySQL 提供了 GRANT 语句来为用户设置权限。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论