章节介绍 #
介绍不同的锁模式怎样生成自增id,以及怎样影响复制。
要点 #
锁模式在启动时由变量innodb_autoinc_lock_mode设置。
相关概念/描述: #
“INSERT-like” 语句 所有会生成新记录的语句,包括INSERT,INSERT…SELECT,REPLACE,REPLACE…INSERT,以及LOAD DATA。包括简单插入、批量插入、混合模式插入。
简单插入 可以提前确定插入条数的语句。
不包括INSERT ... ON DUPLICATE KEY UPDATE语句。批量插入 插入的记录数无法提前确定的语句。包括 INSERT … SELECT,REPLACE … SELECT, LOAD DATA。每插入一行,InnoDB引擎都会给自增字段赋一个新值。
混合模式插入 两种类型: 1,简单插入语句,指定部分记录的自增字段值。如下面的语句
insert into t2 (id,c,d) values(5,5,5),(null,6,6),(7,7,7);插入成功后,三条记录的id值是5,6,7,其中5,6是指定的。 2,INSERT … ON DUPLICATE KEY UPDATE语句。对于后者来说,分配的自增值可能用不到。
innodb_autoinc_lock_mode值 #
此设置项共有三个值,分别是0,1,2。MySQL8.0中默认值是2。MySQL8.0之前的版本默认值是1。
innodb_autoinc_lock_mode = 0 (传统模式) 此模式下,所有 “INSERT-like"语句都会获取一个表级别的AUTO-INC锁。锁会在语句执行完成后释放,而不是事务执行完成。这样做,可以保证自增值是连续的。这对基于语句的复制很重要,因为它保证了主从之间的自增值是一致的。但是,这样做会导致并发性能下降。
innodb_autoinc_lock_mode = 1 (连续模式)
innodb_autoinc_lock_mode = 2 (交叉模式)