innodb引擎對自增欄位(auto_increment)的處理

web k發表於2017-08-22

原文地址: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

 

基於語句的複製安全

 

相關文章