ON DUPLICATE key update导致主键ID跳跃增长

点赞再看,养成习惯,大家好,我是辰兮!今天介绍怎么解决主键ID跳跃增长问题。


开场白

作为程序员的二狗子今天已经把手下的任务做完了,正在假装认真工作的样子尽情摸鱼,二狗子闲得无聊,坐立不安,坐着不是,站着也不是,浑身难受。

老板:“那个.....二狗子,你过来一趟”

二狗子心想,老司机摸鱼被发现啦?怀着忐忑不安的心情去了老板那里。

老板:“这张表主键ID设置的自动增长为什么会跳跃增长,而且增长的速度非常快,再这样下去迟早有一天会突破Int的最高数值,你赶紧想办法解决一下!”

二狗子悬着的心放了下来,心想,还好没抓到我摸鱼,我就说作为老司机的我怎么可能被发现呢

此后,二狗子开始了寻找BUG之路。。。。

一、思路

首先要知道为什么会出现这个问题

二狗子想了想,自测insert几条数据之后发现,问题就在每次执行UPDATE语句后,主键ID也会自动+1,但是按照需求来说执行修改操作主键ID不需要自动+1,不然就会出现主键ID跳跃增长的BUG。

在知道问题之后,最终把问题定位到了ON DUPLICATE KEY UPDATE

二、如何解决

一般解决问题有很多种方案,这里从三个方面来介绍解决方案

1、从项目代码逻辑出发

可以改变代码逻辑,变成先执行update方法,然后判断返回值是否等于0,如果返回值等于0则证明没有数据变动,否则执行insert方法。

 

这样可以解决问题,但是从之前的一次sql变为了两次,会导致效率低下,需要考虑项目大小来选择解决方案。 

2、从问题出发:ON DUPLICATE key update会在update时主键也会自增+1

这样可以在insert之前增加一条sql语句(需要在配置中支持多条sql语句执行):

默认为false,这里需要改为true 

 设置完之后就可以解决ON DUPLICATE key update会在update时主键也会自增+1这个问题了,但是这样每次在执行这个sql时都会调用alter table wss_production_model auto_increment=1,这样会导致效率会变低,需要看项目大小来确定解决方案。

3、从Mysql配置出发

修改innodb_autoinc_lock_mode配置

innodb_autoinc_lock_mode中有3种模式, 0、1、2,mysql默认为1,

  • 0:每次分配自增id的时候都会锁表,这个对并发不太支持
  • 1:只有在bulk insert的时候才会锁表,简单insert的时候只会使用一个light-weight mutex,比0的并发性能高
  • 2:很多不保证,不太安全,不建议使用

修改为0则可以解决问题,然而修改完后会导致在高并发下发生问题,而且线上数据库和本地数据库的配置要同步,这里不推荐使用这种方法。


总结

解决此方案有三种方案:

  1. 从项目代码逻辑出发
  2. 从问题出发
  3. 从配置出发

具体解决方案可以根据项目来选择,如果项目不大,可以考虑1和2。如果不考虑高并发问题,可以考虑3。

我是辰兮,你知道的越多,你不知道的越多,我们下期见!

人才们的 【三连】 就是辰兮创作的最大动力,如果本篇博客有任何错误和建议,欢迎人才们留言!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰兮ing

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值