一天一坑系列Mysql数据库表莫名其妙插入了重复数据,如何一招妙手回春
Posted 善良勤劳勇敢而又聪明的老杨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一天一坑系列Mysql数据库表莫名其妙插入了重复数据,如何一招妙手回春相关的知识,希望对你有一定的参考价值。
1、前言
又是忙碌开发的一天。然鹅,群里老板突然发飙:为什么线上数据出现了重复数据????十万火急,快点处理!!!(这种紧迫感,做过开发的都懂 π__π !)
还能咋办?连接服务器,开整吧~~~~~~~~~~~~~~~
2、解决过程
2.1 查看问题
先根据重复数据订单,查下数据库,看看数据情况:
通过数据表可以看到,同一订单号1961,确实在同一时间创建了两条同样的数据。。炸裂!!
2.2 分析问题
通过数据可以知道,插入数据的时候,数据相同,时间点完全一致,那么肯定是同一操作,出现了double执行。
但是,是如何重复操作的呢?有以下几种可能:
- 重复提交
- 同一请求,被多处响应
- 数据库事务出了问题,出现了脏数据
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