一天一坑系列Mysql数据库表莫名其妙插入了重复数据,如何一招妙手回春

Posted 善良勤劳勇敢而又聪明的老杨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一天一坑系列Mysql数据库表莫名其妙插入了重复数据,如何一招妙手回春相关的知识,希望对你有一定的参考价值。

1、前言

又是忙碌开发的一天。然鹅,群里老板突然发飙:为什么线上数据出现了重复数据????十万火急,快点处理!!!(这种紧迫感,做过开发的都懂 π__π !)

还能咋办?连接服务器,开整吧~~~~~~~~~~~~~~~


2、解决过程

2.1 查看问题

先根据重复数据订单,查下数据库,看看数据情况:

通过数据表可以看到,同一订单号1961,确实在同一时间创建了两条同样的数据。。炸裂!!


2.2 分析问题

通过数据可以知道,插入数据的时候,数据相同,时间点完全一致,那么肯定是同一操作,出现了double执行。

但是,是如何重复操作的呢?有以下几种可能:

  1. 重复提交
  2. 同一请求,被多处响应
  3. 数据库事务出了问题,出现了脏数据

2.3 定位问题

这里先说一下我们的业务流程:生成一个订单,然后通过kafka消费模式,生成订单对应的监控日志。。现在监控日志出现了重复监控数据!!!

通过上面3中可能,需要再定位一下具体问题所在。

第一种情况:

因为重复提交,肯定是存在一个操作时间差的,即使是很快速的请求。。但我们这个数据记录是同一时间点,精确到了秒!!!如果仅仅只是创建订单,同一秒生成重复数据可能性还是很大的!而业务中是通过kafka去消费的,所以可能性并不大!更主要的是,通过查看日志,发现并没有出现重复数据的日志,只有一条插入记录打印日志!如下:

所以,第一种可能性基本排除!!!

第三种情况:

如果数据库出现事务问题,那么势必不会只是1个业务受到影响。大概率是会出现很多问题的。。所以,这一块也暂放。。等排除完其他可能,在深究一番!!!

第二种情况:

这种情况,其实目前是最符合我们业务流程可能会发生的问题所在。。。但是,基于第一条分析中,只打印了一个日志记录,那么,另外一个响应服务器的日志在哪里呢?这成为定位此种可能性的关键所在了!

因为这个服务是单体服务,是直接在flink中启动的,在flink中的日志已经找到了。所以,难道是谁多起了一个服务?于是通过命令

ps -ef|grep 服务项目名

发现该服务的jar包有单独在服务器上启动,也就是说加上flink中启动的那个服务,本服务器上启动了两个服务。
话不多说,胜利的曙光就在眼前。。

进入jar启动路径下的日志查看了一下,果然出现了同一订单的另一条监控日志的插入打印记录。。如下图:


2.4 解决问题

问题已经定位到了!正常情况下,我们只会在flink中启动项目jar包,所以解决方法就是:

kill -9 jar包进程ID

杀死单独启动的jar包的进程即可。。后续观察了一段,果然没有再出现过此问题!


3、总结

解决bug时,一定要胆大心细!冷静分析!按照正确的思维去处理问题,一定会事半功倍的!

路漫漫,bug不断!

bug常伴吾身,面对bug,大喊一声:哈塞给


最后,大家可以说下自己遇到问题和解决BUG的高效解决办法和方式吗?欢迎留言讨论、分享一波!!

以上是关于一天一坑系列Mysql数据库表莫名其妙插入了重复数据,如何一招妙手回春的主要内容,如果未能解决你的问题,请参考以下文章

一天一坑系列SpringCloud微服务项目本地可以正常启动,但在Flink中却无法启动,莫名其妙????

一天一坑系列SpringCloud微服务项目本地可以正常启动,但在Flink中却无法启动,莫名其妙????

一天一坑系列Springboot中AOP拦截不到指定路径的方法,拦截器失效

一天一坑系列手动提交事务,开启后未关闭导致的bug!啊,多么痛的领悟...MySQLTransactionRollbackException: Lock wait timeout exceeded

mysql中获取一天一周一月时间数据的各种sql语句写法

mysql中获取一天一周一月时间数据的各种sql语句写法