innodb引擎对自增字段(auto_increment)的处理

原文地址: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正在等待一个持有表级AUTO-INC锁的insert结束,那它自己也会如同加一把表级AUTO-INC锁

自增字段连续;

基于语句的复制安全

Bulk inserts

表级AUTO-INC锁,插入语句结束锁释放(非事物结束),

对于insert.A..select...B, replace.A..select...B

如果表A 和表B不是同一个,在A表选出的第一条记录加共享锁后,然后在B表加表级AUTO-INC锁;

如果表A 和表B是同一个,在所有select到的行上加共享锁后,再在B表加表级AUTO-INC锁;

自增字段连续

基于语句的复制安全

Mixed-mode inserts

 

基于语句的复制安全

 

posted @ 2017-08-22 17:29  web k  阅读(557)  评论(0编辑  收藏  举报