博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
InnoDBd的auto_increment以及innodb_autoinc_lock_mode
阅读量:2448 次
发布时间:2019-05-10

本文共 1768 字,大约阅读时间需要 5 分钟。

InnoDBauto_increment,类似oraclesequence,可以自动增长,通常用于主键;

auto_increment必须为索引列,其值一旦分配就不能随着相应sql的回滚而回退;

 

InnoDB表创建auto_increment列时,其数据字典会分配一个auto-increment计数器,在内存中操作维护;

第一次向表插入数据时,InnoDB会执行如下语句查看列当前最大值

Select max(ai_col) from t for update

在最大值上增加auto_increment_increment(默认为1)并赋予新插入的ai_col列,若表为空则初始值由auto_increment_offset(默认为1)决定;

也可以显示的为ai_col列赋值,当其大于当前计数器值时则重置计数器为此值,若为Null0则照旧使用计数器;

 

根据其插入行数可将insert分为3类:

Simple inserts:执行时可以确定行数

Bulk inserts:执行时行数不确定,load data/insert … select/replace … insert

Mixed-mode inserts:只有部分行使用auto_increment值,如insert … on duplicate key update

 

在对表进行并发bulk insert时,无法确定每行的auto_increment值,在进行recover或语句级复制时,会出现同一行记录拥有不同的auto_increment值;

 

早期版本,InnoDB在访问auto_increment计数器时会对相应表添加名为auto-inc的表级锁,在sql运行结束时释放,在此之前其他insert会被阻塞;

此举虽然保证了数据一致,但是降低了并发度,为此InnoDB引入了innodb_autoinc_lock_mode,用户可根据实际情况定制锁策略,该参数有如下值

0:采用传统锁模式,所有insert操作都要申请auto-inc锁;

1bulk-inserts采用auto-inc锁,而simple insert则使用更为轻量级的mutex,如表已经有了auto-inc锁,simple insert也要等待直至其释放;

2:所有insert都不采用auto-inc锁,生成的auto_increment可能不连贯

 

至于最特殊的mixed-mode insert,会依据innodb_autoinc_lock_mode的值而产生不同的效果

--c1列采用auto_increment,且当前最大值为100,分别将innodb_autoinc_lock_mode设置为0/1/2进行如下操作

INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');

0

  • +-----+------+
  • | c1  | c2   |
  • +-----+------+
  • |   1 | a    |
  • | 101 | b    |
  • |   5 | c    |
  • | 102 | d    |
  • +-----+------+

--下一个auto_increment值为103,因为其按行一次分配一个,而不是在执行时一次性分配

1

  • +-----+------+
  • | c1  | c2   |
  • +-----+------+
  • |   1 | a    |
  • | 101 | b    |
  • |   5 | c    |
  • | 102 | d    |

+-----+------+

--下一条auto_increment105,在sql执行时一次性分配

2

  • +-----+------+
  • | c1  | c2   |
  • +-----+------+
  • |   1 | a    |
  • |   x | b    |
  • |   5 | c    |
  • |   y | d    |
  • +-----+------+

--X/Y具体值受其他并发操作影响

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-752853/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15480802/viewspace-752853/

你可能感兴趣的文章
汉语句子的意群和重音_五重音而不是字节-数据存储和检索方法
查看>>
现实增强 工具包 csdn_增强现实:21世纪教育的理想工具
查看>>
tls 1.2加密_椭圆曲线加密在TLS 1.3中的工作方式
查看>>
pvs-stdio ue4_使用PVS-Studio检查GCC 10编译器
查看>>
inter-rat_数字取证技巧和窍门:基于IM的电报RAT-第二部分
查看>>
物联网细分行业_2020年全国互联网细分市场可靠性研究
查看>>
加拿大加密货币交易_加密货币交易-如何制定可持续战略
查看>>
pvs-stdio ue4_使用PVS-Studio检查电报开放网络
查看>>
寻找新
查看>>
PostgreSQL中的WAL:2.预写日志
查看>>
zephyr操作系统_检查Zephyr操作系统代码
查看>>
Node.js VS Python:哪个更好?
查看>>
notebooks_.NET Core与Jupyter Notebooks预览1
查看>>
pvs-stdio ue4_华为云:如今PVS-Studio多云
查看>>
vc编程查找计算机运行记录_如何查找计算机的正常运行时间和安装日期
查看>>
steam无法显示成人内容_如何在Steam上查看仅限成人游戏
查看>>
轻松将图像上传到Photobucket
查看>>
如何在iPhone或iPad上启用USB受限模式(适用于iOS 11.4.1)
查看>>
注意:浏览器崩溃的技术支持弹出窗口又回来了
查看>>
如何在Ubuntu 11.10中安装Classic Gnome桌面
查看>>