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

mysql同一张表中数据一样的问题和解决

其实问题有两个,但第一个是由于粗心导致的,会简单提及下
问题一:PM新提了个需求,涉及到分表,线下想偷懒就建的单表,线下测试都没问题,但上线后发现如果代码走update流程,分表之间主键id(设置的自增)相同的,都给修改了,这还是自动生成mapper导致的,update的条件是where id = #{id}, 这是个小问题,把where条件改一下就行了

问题二:由于建表时,没有设置唯一索引,导致同一张表中有相同字段的两个数据,因为这个insert/update这个数据的触发是消费MQ消息,结果排查了半天,同一个时间点,发了两个相同的MQ消息,结果线程1消费数据1时,select消息没有结果,然后组装数据准备执行insert;线程2消费数据2时,select消息是在线程1insert前,也没查出来结果,又执行了insert;下面放两个我们自己的监控日志看一下就明白了

在这里插入图片描述

在这里插入图片描述
从上面两张图可以看出执行过程为: 线程2select结果为null–> 线程1select结果为null -->线程2insert–>线程1insert
由于表未设置唯一索引,所以就有了两个相同数据,最后修改insert语句加上ON DUPLICATE KEY UPDATE并把表索引改为唯一索引,但由于线下环境没办法通过MQ复现这样的情况,只是简单测了下ON DUPLICATE KEY UPDATE是否会生效(测试生效),后续等上生产后再看看会不会出现这样的错误(有唯一索引存在肯定不会出现重复的数据,但看看会不会相关报错吧)

总结:无论是单表还是分表,如果表中相同的数据只允许同时存在一条,那么insert语句一定要写成ON DUPLICATE KEY UPDATE并设置唯一索引


http://www.kler.cn/a/444907.html

相关文章:

  • aioice里面candidate固定UDP端口测试
  • 智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之4(百度文库答问 之2)
  • Android详解——ConstraintLayout约束布局
  • STM32MP1linux根文件系统目录作用
  • 解决 Amazon S3 管理控制台中 5GB 大小限制的问题
  • C# Winform双色纸牌接龙小游戏源码
  • 远程桌面连接
  • vue create 创建项目 提示 Failed to check for updates 淘宝 NPM 镜像站喊你切换新域名啦
  • 如何测量分辨率
  • Java8 Stream编码问题
  • 【HTML】动态闪烁圣诞树+雪花+音效
  • 教育版idea及jetbrains全家桶免费使用
  • 七、网络安全-企业数据脱敏
  • 【YOLO】 YOLOv3原理
  • 深入解析 Vue 3 源码:原理与学习指南
  • ffmpeg.exe 命令使用
  • 模型优化之知识蒸馏
  • [Unity Shader] 【游戏开发】【图形渲染】Unity Shader的种类2-顶点/片元着色器与固定函数着色器的选择与应用
  • Android OnTouchListener OnTouchEvent OnClickListener三者之间的关系?
  • DDS信号源如何对声光调制器AOM或偏转器AOD进行控制
  • idea中使用git pull或push报错fatal:unable to access “https://xxxxxxx“的一种解决方法
  • python huggingface模型超时的解决方案
  • [java] 简单的熔断器scala语言案例
  • linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
  • 联合目标检测与图像分类提升数据不平衡场景下的准确率
  • Linux创建普通用户和修改主机名