栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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。

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

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

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036850.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号