Mysql写入数据十几秒后被自动删除了如何解决
作者:南城FE??????? 发布时间:2024-01-27 05:24:15
背景
事情是这样的,在公司内部新开发了一个功能还没有上线,目前部署在测试环境,Node服务会开启一个定时任务,每5分钟会处理好一部分数据写入到mysql数据库中。
在这之前,一切都运行正常,中秋节后上班第一天打开后台系统发现没有数据展示了,然后查询数据库发现历史存储的数据都没了,没了。现在只会存储最新的定时任务执行后的数据。可在此之间没有修改过任何代码,这个就神奇了。
头疼时间
查看写入的数据始终都只会存储最新的数据,则检查是否没有触发更新的逻辑,全部都命中新增的逻辑。
const isExist = await this.Model.findOne({
where: {
projectId
}
});
if (isExist) {
await isExist.destroy()
updateList.push(item)
} else {
createList.push(item)
}
现在的逻辑是将新增和更新分开处理,经检查发现所有的isExist都是null,导致全部命中新增的逻辑。可是数据库中明明是有数据的,为什么查询不出来呢?怀疑是有第三方数据存在脏数据之类的情况,所以我将数据库现存数据全部清空,重新写入查看效果。结果第一次写入是正常的,后续还是不会触发更新,经过查询发现每次写入数据库大约十几秒数据就被清空了。
可是在写入后的代码逻辑中是没有执行删除数据的处理,而且每次都是稳定复现,写入后就被删除了,查询无果无奈找到db帮找原因。db查询日志给出的结论就是有定时执行删除的逻辑。
看到日志只能继续在代码中找原因了。由于此时是使用的 sequelize 的 bulkCreate 批量创建数据,所以开始怀疑是不是这个批量处理的过程中出现了问题,当初是因为每次执行的数据量太多所以没有选择单条执行,这个时候为了排查问题,所以我改成了单条数据 create 方式创建数据。
this.Model.bulkCreate(list)
修改为:
for (const item of list) {
this.Model.create(item)
}
结果不出意外的还是定时被删除了,😭 然后开始怀疑是事务没有提交的问题,虽然此逻辑是完全不需要用到事务操作,但还是抱着怀疑的心态试试看。
let transaction;
try {
// 建立事务对象
transaction = await this.ctx.model.transaction();
for (const item of list) {
// 事务增操作
await this.Model.create(item, {
transaction,
});
// 提交事务
await transaction.commit();
}
} catch (err) {
// 事务回滚
await transaction.rollback();
}
结果不出意外的还是定时被删除了,😭😭😭此时已经没有改动的余地了,此时的天都已经黑了,可是问题还没解决,只能继续面向百度编程了,此时搜索到也有同一个人遇到这样的问题,他的解决方案是修改表名称,这时候也只能死马当作活马医了。
结果出意外的恢复正常写入以及更新了。
为什么更改了表名称后就正常呢,思来想去也想不出为什么。结果今天在重新部署服务的时候看了一眼历史部署记录,发现了端倪。就在假期的最后一天晚上有一个部署记录,然后我回看了和最开始发生数据异常的时间段相差无几。基本就可以断定和此次部署有很大的关系,由于公司内部的部署方案有docker和虚拟机两种方式,导致每个时间段都会有两个定时任务同时执行,由于数据处理的过程中需要查询第三方数据,最后两边写入的时间会存在一定的延时,导致写好的数据被另一边执行了删除的逻辑,由于那台服务器一直未更新修改的代码,一直执行的是最开始那份先删除再更新的逻辑。至于为啥执行了删除但是没有更新,猜想是删除后更新的逻辑出错了。这也是为什么修改了表名称后就正常了,因为那台服务器上面还是旧的代码,新增删除不能读到之前的那张表了,问题到此终于是告一段落了。
来源:https://juejin.cn/post/7143394405032919048


猜你喜欢
- pytorch默认使用单精度float32训练模型,原因在于:使用float16训练模型,模型效果会有损失,而使用double(float6
- python中判断列表为空判断列表为空是一个非常基础的问题。但是也有很多写法。方法1:len()list = []if len(list)
- 先说一下最土的一种方法:Html:<div class="tab-head">
- 相同记录行如何取最大值我想这个东西在作一些相关采购系统或成本报价系统应该很有用的吧取当前的最有效的价格.记录下来与大家分享!--测试数据&n
- 如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解
- 前言数据集下载地址:链接: https://pan.baidu.com/s/17aglKyKFvMvcug0xrOqJdQ?pwd=6i7m
- 前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用细节。1.Proxy 的设置urllib2 默认会使用环境变量 ht
- next()方法当一个文件被用作迭代器,典型例子是在一个循环中被使用,next()方法被反复调用。此方法返回下一个输入行,或引发
- 1 Support Vector Machines1.1 Example Dataset 1%matplotlib inlineimport
- 引言很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm一样好用。这篇文章里,我们认真的讨论下这个问题,
- 在密码学中,凯撒密码(或称恺撒加密、恺撒变换、变换加密)是一种最简单且最广为人知的加密技术。它是一种替换加密的技术。这个加密方法是以恺撒的名
- 本文假设你在 GitHub 上已经有一个想要打包和发布的项目。第 0 步:获取项目许可证在做其他事之前,由于你的项目要开源,因此应该有一个许
- 本文实例讲述了python实现复制整个目录的方法。分享给大家供大家参考。具体分析如下:python有一个非常好用的目录操作类库shutil,
- 使用 Python 对数据进行更新操作对于 es 的更新的操作,不用到 Search() 方法,而是直接使用 es 的连接加上相应的函数来操
- js实现千分符转化function fmoney(s, n){ n = n > 0 && n <= 20 ? n
- 孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslog
- 本文实例讲述了Python封装原理与实现方法。分享给大家供大家参考,具体如下:【封装】 隐藏对象的属性和实现细节,仅对外提供公共访
- 调取摄像头的实现import numpy as npimport cv2cap = cv2.VideoCapture(0)#参数为0时调用本
- 在工作之余抽了点时间写了一下这个,在ie6-ie7-ff下显示位置基本都一致了。(发现demo页面用栅格线做背景,调试还真的容易得多 。热力
- 三、支持XML的公司和它们的开发工具 尽管XML还处在开发阶段,其标准正在由W3C组织制定,但是已经有许多公司表示全力支持XML,并开发了不