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查询日志给出的结论就是有定时执行删除的逻辑。

Mysql写入数据十几秒后被自动删除了如何解决

看到日志只能继续在代码中找原因了。由于此时是使用的 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();
}

结果不出意外的还是定时被删除了,😭😭😭此时已经没有改动的余地了,此时的天都已经黑了,可是问题还没解决,只能继续面向百度编程了,此时搜索到也有同一个人遇到这样的问题,他的解决方案是修改表名称,这时候也只能死马当作活马医了。

Mysql写入数据十几秒后被自动删除了如何解决

结果出意外的恢复正常写入以及更新了。

为什么更改了表名称后就正常呢,思来想去也想不出为什么。结果今天在重新部署服务的时候看了一眼历史部署记录,发现了端倪。就在假期的最后一天晚上有一个部署记录,然后我回看了和最开始发生数据异常的时间段相差无几。基本就可以断定和此次部署有很大的关系,由于公司内部的部署方案有docker和虚拟机两种方式,导致每个时间段都会有两个定时任务同时执行,由于数据处理的过程中需要查询第三方数据,最后两边写入的时间会存在一定的延时,导致写好的数据被另一边执行了删除的逻辑,由于那台服务器一直未更新修改的代码,一直执行的是最开始那份先删除再更新的逻辑。至于为啥执行了删除但是没有更新,猜想是删除后更新的逻辑出错了。这也是为什么修改了表名称后就正常了,因为那台服务器上面还是旧的代码,新增删除不能读到之前的那张表了,问题到此终于是告一段落了。

来源:https://juejin.cn/post/7143394405032919048

标签:Mysq,数据,自动,删除
0
投稿

猜你喜欢

  • python技能之数据导出excel的实例代码

    2022-09-21 15:01:53
  • Tensorflow与RNN、双向LSTM等的踩坑记录及解决

    2021-04-29 21:25:55
  • 61条面向对象设计的经验原则

    2008-05-08 13:05:00
  • 关于JavaScript中的this指向问题总结篇

    2024-04-29 13:21:25
  • python中Tkinter复选框Checkbutton是否被选中判断

    2023-10-20 16:41:19
  • HTML5 JS压缩图片并获取图片BASE64编码上传

    2024-04-17 10:25:44
  • SQL Server SA权限最新入侵方法

    2009-03-25 16:56:00
  • mysql 8.0.17 安装配置图文教程

    2024-01-14 11:44:16
  • pip安装py_zipkin时提示的SSL问题对应

    2021-03-14 18:27:55
  • python错误处理详解

    2023-04-24 11:10:30
  • Java采用setAsciiStream方法检索数据库指定内容实例解析

    2024-01-28 18:40:33
  • Oracle RMAN还原时set newname文件名有空格报错的解决方法

    2024-01-23 18:11:31
  • 简单介绍python封装的基本知识

    2022-04-16 18:51:11
  • LINUX下Oracle数据导入导出的方法详解

    2023-07-06 15:20:32
  • 《设计网事》前言

    2009-07-15 17:19:00
  • Golang如何交叉编译各个平台的二进制文件详解

    2024-05-22 17:48:47
  • 将字符实体引用转换成 Unicode 字符

    2011-07-01 12:31:51
  • 基于mysql replication的问题总结

    2024-01-29 12:50:52
  • 用python3 返回鼠标位置的实现方法(带界面)

    2021-07-17 15:11:40
  • 一个比较完美的spacer div技巧

    2009-03-18 19:29:00
  • asp之家 网络编程 m.aspxhome.com