原文地址:https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-lock-modes
在涉及自增字段的插入时,innodb会上锁,上锁的类型由参数 innodb_autoinc_lock_mode
决定, 参数的不同取值对不同的insert类型加不同的锁。
针对innodb_autoinc_lock_mode insert类型分为4大类:
1. insert-like
insert, insert...select, replace, replace...select, load data...
2.simple inserts
insert, replace, 不包含子查询的插入,特征是插入数量可以预知,但是不包括 insert... on duplicate key update, 因为这个语句使得插入数量变得不可预知
3.Bulk inserts
insert...select, replace...select, load data...
插入数量不可以预知,innodb的处理到具体的行时才分配auto_increment字段的值
4.Mixed-mode inserts
INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d'); 数量预知,但是用户为auto_increment字段指定了部分而不是全部的值
insert...on duplicate key update也属于此模式
第1类包含了所有其他3类。
不同的insert类型在不同的innodb_autoinc_lock_mode取值下的加锁情况如下表:
innodb_autoinc_lock_mode=0(“traditional”) | |
insert-like | 表级AUTO-INC锁,插入语句结束锁释放(非事物结束),基于语句的复制安全,无法并发,自增字段连续 |
simple inserts | 表级AUTO-INC锁,插入语句结束锁释放(非事物结束),基于语句的复制安全,无法并发,自增字段连续 |
Bulk inserts | 表级AUTO-INC锁,插入语句结束锁释放(非事物结束),基于语句的复制安全,无法并发,自增字段连续 |
Mixed-mode inserts | 表级AUTO-INC锁,插入语句结束锁释放(非事物结束),基于语句的复制安全,无法并发,自增字段连续 |
innodb_autoinc_lock_mode=1( “consecutive”),默认值 | |
insert-like | |
simple inserts |
在分配值时计算出要使用的自增字段的值,使用一个轻量级的互斥锁(mutex lock), 其他的insert不用等到语句结束才能执行; 但是如果这个insert正在等待一个持有表级 自增字段连续; 基于语句的复制安全 |
Bulk inserts |
表级
如果表A 和表B是同一个,在所有select到的行上加共享锁后,再在B表加表级 自增字段连续 基于语句的复制安全 |
Mixed-mode inserts |
基于语句的复制安全 |