原文地址:https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-lock-modeshtml
在涉及自增字段的插入時,innodb會上鎖,上鎖的類型由參數 innodb_autoinc_lock_mode
決定, 參數的不一樣取值對不一樣的insert類型加不一樣的鎖。mysql
針對innodb_autoinc_lock_mode insert類型分爲4大類:
sql
1. insert-like安全
insert, insert...select, replace, replace...select, load data...併發
2.simple insertsspa
insert, replace, 不包含子查詢的插入,特徵是插入數量能夠預知,可是不包括 insert... on duplicate key update, 由於這個語句使得插入數量變得不可預知code
3.Bulk insertshtm
insert...select, replace...select, load data...token
插入數量不能夠預知,innodb的處理到具體的行時才分配auto_increment字段的值rem
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 |
基於語句的複製安全 |