原文地址: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 |
基於語句的複製安全 |