innodb引擎對自增字段(auto_increment)的處理

原文地址: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正在等待一個持有表級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

 

基於語句的複製安全

相關文章
相關標籤/搜索