数据库事故

作者: ML李嘉图

背景

下单后,这里就会创建一个订单,这里的订单涉及到几个状态,订单创建订单支付订单服务中完成订单完成

用户在平台下单,首先当然需要填写一些信息,然后点击提交表单,提交后,就会跳转到一个支付页面,同时在支付页面也会有一个支付截止时间,

在这个截止时间内完成支付,订单状态就会进入到订单支付的状态,这个截止时间字段,对应数据表就用 endTime 表示,然后 endTime = createTime + 30 min

最近需要添加一个新的功能,就是能够支持自动退款的操作。

要求如果处于服务中的订单,要是 30 天没有提交完成的信息,那么就会给用户自动退款。

这个时候,就可以继续复用上面提到的 endTime ,只需要设置一下endTime = endTime + 30 Day

通过写一个定时器,每隔几分钟查询订单表,判断是否有处于服务中的订单,并且 endTime 小于当前时间的,如果查询到了的话,就说明这个订单已经超过 30 天的服务周期,那么就执行退款流程。

这个流程上其实是没有问题的,出问题的是在一些历史的订单,因为对于一些历史处于服务中的订单,它的endTime 还是支付截止时间,而不是服务截止时间,即 endTime = createTime + 30 min

所以在自动退款功能上线后,会把历史服务中的订单也扫描出来,然后执行退款操作,但是此时退款操作并没有完成,而是失败了,

因为写的部分逻辑对旧订单没有适配,从而触发了写的兜底的错误报警,造成所有退款操作都被回滚了。

事故复盘

第一时间先定位到异常代码,然后进行解决。

其实通过上述的描述,们也可以发现根本的问题,即对于一些历史订单处理上出现问题,

这个时候,需要做的就是通过对数据库进行刷数操作,把历史订单的 endTime 增加 30 天,比如执行这样一个SQL语句:

UPDATE order SET end_time = DATE_ADD(create_time, INTERVAL 30 DAY)  WHERE STATUS="服务中"

同时在进行订单状态的变更时,

如果该状态不需要使用到 end_time 时,那么需要及时将其清空,

而不能让其存储在数据库中,这样也可以避免以后可能再次发生。

order.endTime = NULL;
order.updateById();

这次事故的发生没有认真观察到之前 end_time 埋下的祸根。

原文创作:ML李嘉图

原文链接:https://www.cnblogs.com/zwtblog/p/15202781.html

文章列表

更多推荐

更多
  • Azure数据工程指南-二十四、数据治理的权限 创建 azure 预览帐户,探索 azure 预览,探索词汇表,浏览资产,以编程方式使用预览,摘要,管理凭证和访问,创建扫描, 许多组织需要建立数据治理流程、标准和方法,并且已经能够使用内部 SQL Server 工具(如 Master
    Apache CN

  • Azure数据工程指南-二十二、Synapse 分析工作区 创建 Synapse 分析工作区,使用 Spark 探索样本数据,用 SQL 查询数据,用 SQL 创建外部表,摘要, 微软 Azure 数据平台的众多新增功能已经围绕许多类似的产品及其在现代 Azure 数据平台中的用途产生了兴奋和困
    Apache CN

  • Azure数据工程指南-二十三、数据块中的机器学习 创建 MLflow 实验,安装 MLflow 库,创建笔记本,选择性测井,自动记录,摘要, 寻求利用机器学习(ML)和人工智能能力的组织和开发人员花费大量时间构建 ML 模型,并寻求一种方法来简化他们的机器学习开发生命周期,以跟踪实验,
    Apache CN

  • Azure数据工程指南-二十一、将 Apache Spark 的 GraphFrame API 用于图形分析 安装 JAR 库,加载新数据表,将数据加载到数据块笔记本中,用顶点和边构建一个图,查询图表,寻找有图案的图案,用 PageRank 发现重要性,探索入度和出度度量,摘要,进行广度优先搜索,查找连接的组件, 图形技术使用户能够以图形的形式
    Apache CN

  • Azure数据工程指南-20 二十、部署 SQL 数据库先决条件,创建 Visual Studio SQL 数据库项目,安装 Visual Studio GitHub 扩展,导入 AdventureWorks 数据库,连接到 GitHub Repo 源代码控制,将
    Apache CN

  • Azure数据工程指南-十九、部署数据工厂更改 先决条件,创建 DevOps 持续集成构建管道,创建 DevOps 持续部署发布渠道,验证部署的数据工厂资源,摘要,Azure PowerShell 任务停止触发器,ARM 模板部署任务,Azure PowerShell 任务启动触发器
    Apache CN

  • Azure数据工程指南-十八、用于 Cosmos DB 的 Azure Synapse 链接 创建一个 Azure Cosmos DB 帐户,启用 Azure Synapse 链接,创建一个 Cosmos DB 容器和数据库,将数据导入 Azure Cosmos DB,在 Azure Synapse Analytics 中创建
    Apache CN

  • Azure数据工程指南-十六、流分析异常检测 先决条件,创建流分析输入和输出,创建实时电源 BI 仪表板,监控实时电源 BI 流,摘要,创建 Azure 流分析作业,创建物联网中心,创建 Power BI 服务,下载设备模拟器,添加流输入,添加流输出,编写流分析查询,启动流分析作业
    Apache CN

  • Azure数据工程指南-十七、使用 Apache Spark 的实时物联网分析 先决条件,创建物联网中心,创建数据块集群,安装 Maven 库,创建笔记本并运行结构化流查询,摘要,配置笔记本连接,开始结构化流,启动物联网设备模拟器,显示实时流数据,创建 Spark SQL 表,将流写入增量表, 实时物联网分析、高级
    Apache CN

  • Azure数据工程指南-十五、DeltaLake 为什么是酸性 DeltaLake,先决条件,创建并插入 DeltaLake,更新 DeltaLake,从 DeltaLake 删除,浏览增量日志,摘要,插入,更新,删除, 在使用 Azure Data Lake Storage Gen2
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多