当前位置: 首页 > news >正文

记一次由于代码原因导致Mysql连接被打满和唯一索引重复问题

先说一下事情产生的背景:原先的代码逻辑是消费MQ,然后请求其他服务的接口,对接口的返回值result做落库操作,现在要新加个逻辑,做完落库操作后还要再将result封装落到新表中;即消费一次MQ(MQ消息的频率非常高),两个落库操作(一个是新表);但上线时发现mysql连接被打满了,然后通过自己公司的监控系统去排查,原先的落库操作A的QPS只有800左右,但新加的落库操作B却达到了4000+的QPS,直接翻了5倍,当时就懵了,看代码也没问题,代码伪逻辑如下:

1.获取MQ数据
2.MQ数据去请求其他服务接口,获取返回值
3.对返回值操作,落到原先的表
4.对返回值封装落到新表中,但问题就出现在这里了,因为落新表时不只是直接insert4.1: 先根据封装后的值查询一次代码,如果数据库已有数据就update4.2: 如果数据库没有数据,就insertif(queryByTeaId(查询字段teacherId) !=null){updateByTeaId(封装后的值和更新条件teacherId)}else{insert(封装后的值)	}

结果由于新表对于查询字段没有建立索引,且虽然是新表,但另一个离线任务一直在往里写着数据,已有的数据量已经非常大了
,导致报错:com.alibaba.druid.pool.GetConnectionTimeoutException,后来对表中字段teacherId加了唯一索引后,完美解决问题。

但后续又延伸出另一个问题:Mysql表中teacherId是设置的唯一索引,但由于是一直消费MQ,MQ消息中是studentId,会反查teacherId,所以多个消息可能对应的是同一个teacherId,但代码都懂得,多线程执行的,所以插入时,偶然在代码中报了唯一键重复的错误,由于文章时后面写的,具体报错没保存也懒的百度了,虽然是偶发事件,但还是得解决,本来想的是在代码中把查询、插入、更新的代码写带一个方法中,给这个方法加上@Transactional事务注解,但后来一想,多线程情况下,这也解决不了问题,但此业务又不是很重要,没必要用到分布式锁,所以后面从sql入手,使用ON DUPLICATE KEY UPDATE算是解决了多线程插入导致唯一键冲突的问题,如下:

-- teacher_id 设置的是唯一索引
insert into tableName name,age,sex,teacher_id values('zhangsan',18,1,1234) ON DUPLICATE KEY UPDATE name = 'lisi',
age = 19,sex = 0 ;

由于很少用ON DUPLICATE KEY UPDATE,所以我以为只会检查主键是否重复,特意去百度了下,介绍如下:

ON DUPLICATE key update是根据索引字段是否重复来判断是否执行,如果重复则执行update,否则则执行insert。

优先级主键>唯一索引
  • 当主键重复时则执行update
  • 当主键不重复,唯一索引重复时也执行update
  • 当主键和唯一索引值都不重复才执行insert

特殊情况,当主键重复执行update时,如果此时唯一索引字段与其他字段也重复则会报错

http://www.lryc.cn/news/355344.html

相关文章:

  • redis数据类型之string,list
  • Android android.os.DeadObjectException aidl通信异常分析及解决
  • dp + 计数,1954D - Colored Balls
  • 【设计模式深度剖析】【5】【结构型】【桥接模式】| 以电视和遥控器为例加深理解
  • 一键安装脚本sh
  • WebGL在医学成像方面的应用
  • SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)
  • 项目范围管理
  • 监管端..
  • 点击登录按钮先检测输入框的规则检测(vue组合式)
  • 网络工程师---第四十二天
  • leetcode 1241每个帖子的评论数(postgresql)
  • 前端最新面试题(ES6模块篇)
  • STM32H750外设之ADC通道选择
  • 【Unity2D 2022:Cinemachine】相机跟随与地图边界
  • ssh远程连接的相关配置
  • 在leafet上画圆、多边形、线、矩形
  • SpringBoot中如何在服务器进行校验?
  • element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入
  • 【绝地求生game】
  • Mac上Steam安装的游戏已经卸载,但游戏的快捷方式图标仍存在的解决方式
  • PTA 判断两个矩阵相等
  • 《征服数据结构》双向链表
  • 我用 Midjourney 的这种风格治愈了强迫症
  • 三维大场景管理-3Dtiles规范
  • Flutter 中的 FractionalTranslation 小部件:全面指南
  • Thrift快速入门开发demo
  • 关于C++智能指针复习总结
  • Prometheus Operator创建告警规则并接入钉钉报警
  • Word整理论文参考文献