| # 当我们为表的某个列添加 AUTO_INCREMENT 属性时,数据库会自动添加自增锁 |
| CREATE TABLE `teacher` ( |
| `id` int NOT NULL AUTO_INCREMENT, |
| `name` varchar(255) NOT NULL, |
| PRIMARY KEY (`id`) |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; |
| |
| 1. “Simple inserts” (简单插入) |
| 可以 预先确定要插入的行数 (当语句被初始处理时)的语句。包括没有嵌套子查询的单行和多行INSERT...VALUES() 和 REPLACE 语句。 |
| 比如我们上面举的例子就属于该类插入,已经确定要插入的行数 |
| 2. “Bulk inserts” (批量插入) |
| 事先不知道要插入的行数 (和所需自动递增值的数量)的语句。比如 INSERT ... SELECT , REPLACE... SELECT 和 LOAD DATA 语句,但不包括纯INSERT。 |
| InnoDB在每处理一行,为AUTO_INCREMENT列分配一个新值。 |
| 3. “Mixed-mode inserts” (混合模式插入) |
| 这些是“Simple inserts”语句但是指定部分新行的自动递增值。例如 INSERT INTO teacher (id,name) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d'); |
| 只是指定了部分id的值。另一种类型的“混合模式插入”是 INSERT ... ON DUPLICATE KEY UPDATE |
| |
| innodb_autoinc_lock_mode有三种取值,分别对应与不同锁定模式: |
| (1)innodb_autoinc_lock_mode = 0(“传统”锁定模式) |
| 在此锁定模式下,所有类型的insert语句都会获得一个特殊的表级AUTO-INC锁,用于插入具有AUTO_INCREMENT列的表。这种模式其实就如我们上面的例子, |
| 即每当执行insert的时候,都会得到一个表级锁(AUTO-INC锁),使得语句中生成的auto_increment为顺序,且在binlog中重放的时候,可以保证master与 |
| slave中数据的auto_increment是相同的。因为是表级锁,当在同一时间多个事务中执行insert的时候,对于AUTO-INC锁的争夺会 限制并发 能力。 |
| (2)innodb_autoinc_lock_mode = 1(“连续”锁定模式) |
| 在 MySQL 8.0 之前,连续锁定模式是 默认 的。 |
| 在这个模式下,“bulk inserts”仍然使用AUTO-INC表级锁,并保持到语句结束。这适用于所有INSERT ... SELECT,REPLACE ... SELECT和LOAD DATA语句。 |
| 同一时刻只有一个语句可以持有AUTO-INC锁。 |
| 对于“Simple inserts”(要插入的行数事先已知),则通过在 mutex(轻量锁) 的控制下获得所需数量的自动递增值来避免表级AUTO-INC锁,它只在分配过程的持续时间内保持, |
| 而不是直到语句完成。不使用表级AUTO-INC锁,除非AUTO-INC锁由另一个事务保持。如果另一个事务保持AUTO-INC锁,则“Simple inserts”等待AUTO-INC锁,如同它是一个“bulk inserts”。 |
| (3)innodb_autoinc_lock_mode = 2(“交错”锁定模式) |
| 从 MySQL 8.0 开始,交错锁模式是 默认 设置。 |
| 在此锁定模式下,自动递增值 保证 在所有并发执行的所有类型的insert语句中是 唯一 且 单调递增 的。但是,由于多个语句可以同时生成数字(即,跨语句交叉编号), |
| 为任何给定语句插入的行生成的值可能不是连续的。 |
| MySQL5.5引入了meta data lock,简称MDL锁,属于表锁范畴。MDL 的作用是,保证读写的正确性。比如,如果一个查询正在遍历一个表中的数据, |
| 而执行期间另一个线程对这个表结构做变更,增加了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。 |
| 因此,当对一个表做增删改查操作的时候,加 MDL读锁;当要对表做结构变更操作的时候,加 MDL 写锁。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南