news 2026/6/4 13:03:45

MySQL,InnoDB的auto-inc自增列,据说是表锁?(第6讲,长文收藏)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL,InnoDB的auto-inc自增列,据说是表锁?(第6讲,长文收藏)

《数据库架构100讲》

6. MySQL InnoDB锁:自增锁

今天介绍InnoDB七种锁的第一种:自增锁(Auto-inc Locks)。

一,案例说明

MySQL,InnoDB,默认的隔离级别(RR),假设有数据表:

t(id AUTO_INCREMENT, name);

数据表中有数据:

1, shenjian

2, zhangsan

3, lisi

事务A执行,还未提交

insert into t(name) values(xxx);

事务B执行:

insert into t(name) values(ooo);

问:事务B会不会被阻塞?

二,案例分析

InnoDB在RR隔离级别下,能解决幻读问题,上面这个案例中:

(1)事务A先执行insert,会得到一条(4, xxx)的记录,由于是自增列,故不用显示指定id为4,InnoDB会自动增长,注意此时事务并未提交;

(2)事务B后执行insert,假设不会被阻塞,那会得到一条(5, ooo)的记录;

此时,并未有什么不妥,但如果,

(3)事务A继续insert:

insert into t(name) values(xxoo);

会得到一条(6, xxoo)的记录。

(4)事务A再select:

select * from t where id>3;

得到的结果是:

4, xxx

6, xxoo

画外音:不可能查询到5的记录,在RR的隔离级别下,不可能读取到还未提交事务生成的数据。

咦,这对于事务A来说,就很奇怪了,对于AUTO_INCREMENT的列,连续插入了两条记录,一条是4,接下来一条变成了6,就像莫名其妙的幻影。

三,自增锁(Auto-inc Locks)

自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。

画外音,官网是这么说的:

An AUTO-INC lock is a special table-level lock taken by transactions inserting into tables with AUTO_INCREMENT columns. In the simplest case, if one transaction is inserting values into the table, any other transactions must wait to do their own inserts into that table, so that rows inserted by the first transaction receive consecutive primary key values.

与此同时,InnoDB提供了innodb_autoinc_lock_mode配置,可以调节与改变该锁的模式与行为。

四,假如不是自增列

上面的案例,假设不是自增列,又会是什么样的情形呢?

t(id unique PK, name);

数据表中有数据:

10, shenjian

20, zhangsan

30, lisi

事务A执行,在10与20两条记录中插入了一行,还未提交

insert into t values(11, xxx);

事务B执行,也在10与20两条记录中插入了一行:

insert into t values(12, ooo);

这里,便不再使用自增锁,那:

(1)会使用什么锁?

(2)事务B会不会被阻塞呢?

知其然,知其所以然。

思路比结论更重要。

画外音:我学的MySQL知识基于5.6。

==全文完==

有架构合集吗?

《流量从10万到10亿,80个架构问题》

《关于即时通讯架构的一切!》

直播:每天只有30分钟,做什么副业合适?欢迎预约!

最近做了一个新产品:

70天,每天30分钟,短视频行动营(第二曲线最佳选择)

欢迎感兴趣的同学一起参与!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 4:49:18

变量命名终极方案:Codelf如何为中文开发者解决命名难题

变量命名终极方案:Codelf如何为中文开发者解决命名难题 【免费下载链接】codelf A search tool helps dev to solve the naming things problem. 项目地址: https://gitcode.com/gh_mirrors/co/codelf 作为一名中文开发者,你是否曾为变量命名而反…

作者头像 李华
网站建设 2026/5/30 21:40:38

RAX3000M路由器OpenWrt固件终极选择指南:kernel.bin vs sysupgrade.bin

RAX3000M路由器OpenWrt固件终极选择指南:kernel.bin vs sysupgrade.bin 【免费下载链接】Actions-rax3000m-emmc Build ImmortalWrt for CMCC RAX3000M eMMC version using GitHub Actions 项目地址: https://gitcode.com/gh_mirrors/ac/Actions-rax3000m-emmc …

作者头像 李华
网站建设 2026/5/3 15:02:23

解决pip安装包慢问题:配置清华源轻松安装TensorFlow

解决pip安装包慢问题:配置清华源轻松安装TensorFlow 在人工智能项目开发中,最让人抓狂的场景之一莫过于——你已经写好了模型代码,数据也准备就绪,只差一步 pip install tensorflow,结果终端卡在“Collecting tensorf…

作者头像 李华
网站建设 2026/5/31 9:38:12

刚刚,GPT-5.2满分屠榜,让打工人每周少干10小时!

转自:机器之心谷歌的领先优势,只保持了不到一个月。今天是 OpenAI 的十周年纪念日,十周年之际,来点大的。在「红色警报」后,OpenAI 在北京时间本周五拿出了最新的顶级模型 GPT-5.2 系列 —— 迄今为止在专业知识工作上…

作者头像 李华
网站建设 2026/5/29 19:54:12

同济大学第七版线性代数教材PDF资源终极指南:5步高效学习方案

同济大学第七版线性代数教材PDF资源终极指南:5步高效学习方案 【免费下载链接】线性代数-同济大学第七版资源下载 本仓库提供《线性代数-同济大学第七版》的资源文件下载。该资源文件包含了同济大学第七版线性代数教材的完整内容,适用于学习线性代数的学…

作者头像 李华
网站建设 2026/6/3 6:49:59

字节校招生:每天仅洗数据,年薪自爆 180万…

来自:推荐一个程序员编程资料站:http://cxyroad.com副业赚钱专栏:https://xbt100.top2024年IDEA最新激活方法后台回复:激活码CSDN免登录复制代码插件下载:CSDN复制插件以下是正文。刚看到个贴子,说有字节的…

作者头像 李华