为了解决这个问题,我们就需要选择适合自己的 innodb_autoinc_lock_mode。...2.2 innodb_autoinc_lock_mode 我们可以通过控制 innodb_autoinc_lock_mode 变量的值,来控制在主键自增的时候,MySQL 锁的处理思路。...从上面的介绍中小伙伴们可以看到,实际上第三种,也就是 innodb_autoinc_lock_mode 取值为 2 的情况下,并发效率是最强的,那么我们是不是就应该设置 innodb_autoinc_lock_mode...2.3 实践 接下来我们来通过一个简单的 SQL 来和小伙伴们演示一下 innodb_autoinc_lock_mode 不同取值对应不同结果的情况。...小结 好啦,这就是关于主键自增的一个小小知识点,小伙伴们一定要根据实际情况来为 innodb_autoinc_lock_mode 属性取一个合适的值。
The innodb_autoinc_lock_mode configuration option controls the algorithm used for auto-increment locking...这个参数,它用于控制获取自增值的加锁方式 innodb_autoinc_lock_mode,它有0、1、2三个值。...下面详细说明一下关于innodb_autoinc_lock_mode属性 (1) innodb_autoinc_lock_mode=0 代表传统模式,也就是说,在对有自增属性的字段插入记录时,会持续持有一个表级别的自增锁...(3) innodb_autoinc_lock_mode=2 代表交错模式。这个模式下放弃了自增表锁,产生的值会不连续。不过这是性能最高的模式,多条插入语句可以并发执行。...也即是在RBR模式下,innodb_autoinc_lock_mode=2是安全的,其他情况还是建议设置为1. 墨天轮原文链接:https://www.modb.pro/db/29406
HireDate date, constraint pk_employee primary key(EmpNo) ); 二、创建员工表自动增长序列 create sequence employee_autoinc...with 1 increment by 1 nocache; 三、创建触发器将序列中的值赋给插入employee表的行 create or replace trigger insert_employee_autoinc...before insert on employee for each row begin select employee_autoinc.nextval into :new.Id from dual;...end insert_employee_autoinc; / 四、验证 insert into employee(DeptNo,EmpNo,Ename,job,sal,hiredate) values
参数innodb_autoinc_lock_mode的参数来控制自增长的模式,它的取值可以是0,1,2,代表的含义上面的文章中有讲过。这里不再赘述。...InnoDB DEFAULT CHARSET=utf8 row in set (0.00 sec) mysql:yeyztest ::>>show variables like '%innodb_autoinc_lock_mode...-------+-------+ | Variable_name | Value | +--------------------------+-------+ | innodb_autoinc_lock_mode...它的本质其实是在参数innodb_autoinc_lock_mode上,这个参数设置为1的时候,相当于将这种auto_inc lock弱化为了一个更轻量级的互斥自增长机制去实现,官方称之为mutex。...2、对于常规的insert操作,可以使用参数innodb_autoinc_lock_mode来控制是否使用表级别的锁,如果该参数是0,则使用表级别的auto_inc 锁,如果该参数是1,则使用互斥自增长机制实现主键的自增
innodb_autoinc_lock_mode=1(consecutive lock mode,MySQL 8.0 之前默认 ):对于不确定插入数量的语句(例如INSERT ......SELECT和LOAD DATA)和 innodb_autoinc_lock_mode=0 一样,其他的确定数量的语句在执行前先批量获取 id,之后再执行语句。...innodb_autoinc_lock_mode=2(interleaved lock mode,MySQL 8.0+ 默认 ):采用乐观锁, CAS 更新计数器获取。...目前有三种锁模式,对应 innodb_autoinc_lock_mode 的值, 0 ,1,2....2.innodb_autoinc_lock_mode=1(consecutive lock mode) 这种情况下,针对未知数量批量插入(例如INSERT ...
(3) handler首次open的时候,会查询当前表中最大自增列的值,并用最大列的值加1来初始化表的data_dict_t结构体中的autoinc的值。 (4) insert流程。...(auto_inc, 1, increment, offset, col_max_value); error = innobase_set_max_autoinc(auto_inc...此时,首次插入时,write_row流程会调用handler::update_auto_increment来设置autoinc相关的信息。...通过上述分析,这个bug仅在autoinc_lock_mode > 0 并且auto_increment_increment > 1的情况下会发生。...但是前面两种都出现了autoinc错误,唯独hz_freeze_balance_sharding表没有出错。难道是用户对这两种表的访问方式不一样?
(3) handler首次open的时候,会查询当前表中最大自增列的值,并用最大列的值加1来初始化表的data_dict_t结构体中的autoinc的值。 (4) insert流程。...BUG 76872 / 88321: "InnoDB AUTO_INCREMENT produces same value twice" (1) bug概述:当autoinc_lock_mode大于0,...此时,首次插入时,write_row流程会调用handler::update_auto_increment来设置autoinc相关的信息。...通过上述分析,这个bug仅在autoinc_lock_mode > 0 并且auto_increment_increment > 1的情况下会发生。...但是前面两种都出现了autoinc错误,唯独hz_freeze_balance_sharding表没有出错。难道是用户对这两种表的访问方式不一样?
=0(traditional lock mode):获取表锁,语句执行结束后释放 innodb_autoinc_lock_mode=1(consecutive lock mode,MySQL 8.0 之前默认...SELECT和LOAD DATA)和 innodb_autoinc_lock_mode=0 一样,其他的确定数量的语句在执行前先批量获取 id,之后再执行语句。...innodb_autoinc_lock_mode=2(interleaved lock mode,MySQL 8.0+ 默认 ):采用乐观锁, CAS 更新计数器获取。...目前有三种锁模式,对应 innodb_autoinc_lock_mode 的值, 0 ,1,2....innodb_autoinc_lock_mode=1(consecutive lock mode) 这种情况下,针对未知数量批量插入(例如INSERT ...
(3) handler首次open的时候,会查询当前表中最大自增列的值,并用最大列的值加1来初始化表的data_dict_t结构体中的autoinc的值。 (4) insert流程。...(auto_inc, 1, increment, offset, col_max_value); error = innobase_set_max_autoinc(auto_inc);...此时,首次插入时,write_row流程会调用handler::update_auto_increment来设置autoinc相关的信息。...通过上述分析,这个bug仅在autoinc_lock_mode > 0 并且auto_increment_increment > 1的情况下会发生。...但是前面两种都出现了autoinc错误,唯独hz_freeze_balance_sharding表没有出错。难道是用户对这两种表的访问方式不一样?
连续锁模式 (consecutive) innodb_autoinc_lock_mode = 1 这是默认的锁模式。...当 innodb_autoinc_lock_mode = 2 或者主从使用不同的 innodb_autoinc_lock_mode 时,主从无法保证使用相同的自增列值; 基于行级别和复合模式的复制,innodb_autoinc_lock_mode...大量插入导致的间隙 当参数值 innodb_autoinc_lock_mode 设置为 0 或 1 时,每条语句生成的自增列值都是连续的,不会产生间隙。...innodb_autoinc_lock_mode = 1 (root@localhost) [test] > show global variables like 'innodb_autoinc_lock_mode...innodb_autoinc_lock_mode = 2 (root@localhost) [test] > show global variables like 'innodb_autoinc_lock_mode
函数可以获得最后一个插入的数字 select last_insert_id(); 五、自增锁 如果存在自增字段,MySQL会维护一个自增锁,和自增锁相关的一个参数为(5.1.22版本之后加入) innodb_autoinc_lock_mode...六、自增的过程 第一种,插入空值的时候 当innodb_autoinc_lock_mode=0时 1、申请AUTO_INC锁 2、得到当前的AUTO_INCREMENT值n,并加1 3、执行插入操作...如果失败流程结束 3、如果成功,申请AUTO_INC锁 4、调用set_max函数,修改AUTO_INCREMENT 5、语句结束,释放AUTO_INC锁 七、存在的问题 1、复制的问题 在innodb_autoinc_lock_mode...也就是说在RBR模式下,innodb_autoinc_lock_mode=2是安全的,其他情况还是建议设置为1. 2、load data的问题 当使用load data语句的时候,就算innodb_autoinc_lock_mode
另一个热点可能是AUTO_INCREMENT锁机制:如果遇到这个问题,则可能需要考虑重新设计表或者应用,或者更改innodb_autoinc_lock_mode配置。...并且从该版本开始,InnoDB存储引擎提供了一个参数innodb_autoinc_lock_mode(自增锁模式)来控制自增长的模式,该参数的默认值为1或者2。...show variables like 'innodb_autoinc_lock_mode'; 参数innodb_autoinc_lock_mode总共有三个有效值可供设定,即0、1、2。
可以通过 innodb_autoinc_lock_mode 进行配置。...innodb_autoinc_lock_mode = 0 (“traditional” lock mode:全部使用表锁) innodb_autoinc_lock_mode = 1 (默认)(“consecutive...” lock mode:可预判行数时使用新方式,不可时使用表锁) innodb_autoinc_lock_mode = 2 (“interleaved” lock mode:全部使用新方式,不安全,不适合
参数innodb_autoinc_lock_mode的不同会影响锁的释放时机: 该参数如果为0,语句执行结束后释放锁 设置为1:普通insert语句,自增锁在申请后马上释放;insert...select...这样的批量插入语句等语句结束后才释放 设置为2:申请后就释放锁 show global variables like 'innodb_autoinc_lock_mode'; 如果innodb_autoinc_lock_mode...语句执行过程中,第一次申请自增id,分配1个 1个用完以后,第二次申请,会分配2个 2个用完以后,第三次申请,会分配4个 依此类推,每次申请都是上一次的两倍(最后一次申请不一定全部使用) 在innodb_autoinc_lock_mode
通过innodb_autoinc_lock_mode参数可以设置自增主键的生成策略。...如果使用innodb_autoinc_lock_mode = 2(“interleaved”)或主从不使用相同的锁定模式的配置,自动递增值不能保证在从机上与主机上相同。...innodb_autoinc_lock_mode=0时,auto-increment值一次只分配一个,而不是在开始时全部分配。...当innodb_autoinc_lock_mode=1时,不同于innodb_autoinc_lock_mode=0时的情况,因为auto-increment值在语句一开始就分配了,但实际可能使用不完。...当innodb_autoinc_lock_mode=2时,取决于并发语句的执行顺序。 8.
'email', 'age', // _pk 表示主键字段名称 '_pk' => 'id', //_autoinc...表示主键是否自动增长类型 '_autoinc' => true ); 字段的访问 thinkphp支持对象和数组两种方式来访问数据属性 对象访问...'username', 'email', 'age', // _pk 表示主键字段名称 '_pk' => 'id', //_autoinc...表示主键是否自动增长类型 '_autoinc' => true ); /*****第三部分:业务逻辑定义 (可选)********/ public
wsrep_log_conflicts # This changes how InnoDB autoincrement locks are managed and is a requirement for Galera innodb_autoinc_lock_mode...innodb_autoinc_lock_mode Galera仅支持InnoDB的交错(2)锁定模式。设置传统(0)或连续(1)锁定模式会导致复制失败,因为未解决的死锁。...将此变量设置为innodb_autoinc_lock_mode=2。
查询: 在线配置: 配置文件:innodb_log_group_home_dir = /Data/data innodb_autoinc_lock_mode 参考 这个参数控制着在向有auto_increment...consecutive(innodb_autoinc_lock_mode=1) 模式: 1、这一模式下去simple insert 做了优化,由于simple insert一次性插入值的个数可以立马得到确定...它保证了基于语句复制的安全) 2、这一模式也是mysql的默认模式,这个模式的好处是auto_inc锁不要一直保持到语句的结束,只要语句得到了相应的值后就可以提前释放锁 interleaved(innodb_autoinc_lock_mode...由于现在mysql已经推荐把二进制的格式设置成row,所以在binlog_format不是statement的情况下最好是innodb_autoinc_lock_mode=2 这样可以得到更好的性能。...查询: 在线配置: 配置文件:innodb_autoinc_lock_mode = 2
领取专属 10元无门槛券
手把手带您无忧上云