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

基于语句的复制安全

innodb引擎对自增字段(auto_increment)的处理的更多相关文章

  1. 为什么推荐InnoDB引擎使用自增主键?

    索引使用时遇到的问题(顺丰)--InnoDB引擎不使用自增主键导致性能问题,也可答最左前缀 InnoDB自增主键 InnoDB主索引(同时也是数据文件)的示意图: 上文讨论过InnoDB的索引实现,I ...

  2. mysql自增字段AUTO_INCREMENT重排或归零

    由于删除了某些记录行,导致自增字段不连续了,重排或归零的方法: 方法1:truncate table 你的表名//这样不但重新定位自增的字段,而且会将表里的数据全部删除,慎用! 方法2:delete ...

  3. INNODB自增主键的一些问题 vs mysql获得自增字段下一个值

    今天发现 批量插入下,自增主键不连续了....... InnoDB AUTO_INCREMENT Lock Modes This section describes the behavior of A ...

  4. mysql 约束条件 auto_increment 自动增长 修改自增字段起始值

    创建一张表 t20 mysql) ); Query OK, rows affected (0.01 sec) mysql> desc t20; +-------+----------+----- ...

  5. Mysql中自增字段(AUTO_INCREMENT)的一些常识

    Mysql中自增字段(AUTO_INCREMENT)的一些常识: http://chengxuyuan.naxieshir.com/fenlei/2/p/151.html

  6. MySQL 自增字段取值

    1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值 ...

  7. Mysql优化系列(1)--Innodb引擎下mysql自身配置优化

    1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色 ...

  8. 自增字段 auto_commit的研究分析

    MySQL自增字段,自增字段计数器在主存储里面,不在硬盘上(This counter is stored only in main memory, not on disk). 1,添加表,设立自增主键 ...

  9. MyIASM和Innodb引擎详解

    MyIASM 和 Innodb引擎详解 Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级 ...

随机推荐

  1. Mac下配置Hive环境

    在配置Hive环境之前,需要Hadoop环境. 安装Hive 点击下载 下载结束后,会有一个.tar文件,使用以下命令解压该文件. tar -zxvf 要解压的tar包 解压完成后如下 修改Hive配 ...

  2. ref用于类类型

    static void Main(string[] args)         { Fruit f = new Fruit()      { Weight = 1, Color = "&qu ...

  3. C++实现可变参数列表

    // 接收数量不定的实参.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #includ ...

  4. Qt570_CentOS64x64_02

    1.Qt570的简单测试项目,在做"重新构建"的操作的时候,出现1个问题,Qt底下的"编译输出"窗口中的信息为: cc1plus: error: unrecog ...

  5. shell sort命令

    用法:sort [选项]... [文件]...串联排序所有指定文件并将结果写到标准输出. 排序选项: -b, --ignore-leading-blanks 忽略前导的空白区域 -d, --dicti ...

  6. 数论练习(6)——hdu A/B(逆元gcd)

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. L187 DKK2

    Why can millions of hairs grow from our heads, and yet our palms手掌 and the soles of our feet are as ...

  8. MyEclipse web jsp 如何调试

    MyEclipse如何调试 | 浏览:882 | 更新:2014-03-13 17:38 1 2 3 4 5 分步阅读 当程序写好之后,如何调试呢? 我们在MyEclipse中jav添加断点,运行de ...

  9. java并发编程之二--CountDownLatch的使用

    CountDownLatch类 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...

  10. MarkDown格式作业模板

    发布的随笔可复制下面的MarkDowm模板 注意事项 标题第XX次作业替换成相应的第一次作业.第二次作业...... 代码托管的链接一定要换成自己的项目 码云提交历史截图必须是自己每周的提交截图 #& ...