编辑
2025-02-25
工具
00

生产环境数据库数据异常丢失问题复盘排查报告

1. 问题概述

生产环境中,一个基于 SOFA 框架的定时任务在执行过程中,出现了严重的数据不一致现象:任务调度执行上游服务 A 创建指令数据,服务 A 在逻辑中(同事通过手动事务)进行了提交;随后调用服务 B,服务 B 能成功查询到该指令数据,但在尝试更新数据状态时失败(异常被内部捕获处理)。然而,流程结束后检查数据库,发现服务 A 创建的指令数据完全消失,且数据库层面未记录到该数据的成功提交日志。此现象不符合预期的业务逻辑和数据库 ACID 特性。

令人比较费解的是,尽管在异常流程中,服务 B 能够成功查询到由服务 A 创建的数据,并且其内部尝试更新数据时发生的失败异常得到了妥善的捕获和处理(未向外抛出),服务 A 创建的本应持久化的数据最终却从数据库中完全消失,同时数据库层面也未能追踪到该数据成功提交的事务日志。

后续通过一项关键的验证步骤——在生产环境中临时移除对服务 B 的调用后,此数据丢失问题便不再复现。

2. 问题背景与详细现象描述

  • 技术环境:
    • 应用框架: SOFA 框架
    • 核心组件: 定时任务调度机制
    • 数据库: MySQL
    • 事务管理: 主要依赖 Spring 的声明式事务 (@Transactional),但服务 A 早期被描述为“手动提交事务”,可能存在手动 JDBC 事务代码与 @Transactional 的混合使用。系统中未使用分布式事务中间件(如 Seata)。
  • 业务流程:
    1. SOFA 定时任务按预定时间触发。
    2. 定时任务调用服务 A 的业务逻辑。
    3. 服务 A: 生成一条指令数据,并将其持久化到数据库。
    4. 服务 A: 调用服务 B 的接口,传递相关指令信息。
    5. 服务 B: 接收到调用后,首先根据指令 ID 查询数据库,验证指令是否存在。
    6. 服务 B: 如果查询到指令,则尝试更新该指令的状态等信息。
  • 异常现象详细记录:
    • (✓) 查询成功: 服务 B 在执行更新逻辑前,通过日志确认能够成功查询到由服务 A 创建并(理论上已)保存的指令数据。
    • (✗) 更新失败: 服务 B 在对该指令数据执行 UPDATE 操作时发生错误。具体错误原因未在本次排查中明确(可能是锁竞争、约束违反等),但这本身不是数据丢失的直接原因。
    • (✓) 异常内部处理: 服务 B 的代码使用了 try-catch 块捕获了 UPDATE 操作抛出的异常,仅在日志中打印了 error 信息,没有将异常重新抛出。因此,从调用栈来看,服务 B 的方法是“正常”返回给服务 A 的。
    • (✓) 后续流程正常: 服务 B 捕获异常后,其后续的业务代码(如果有的话)继续执行,并且调用服务 B 的服务 A 以及整个定时任务的后续流程(如果服务 A/定时任务在调用 B 后还有其他步骤)在日志层面看起来是正常执行完毕的,没有记录到其他的业务或框架级异常。
    • (✗) 数据最终丢失: 在整个定时任务执行完毕后,通过数据库客户端或后续查询发现,服务 A 最初创建的那条指令数据在数据库中消失了,无法找到。
    • (✗) 无数据库提交日志: DBA 通过检查数据库的相关日志(如 Binlog、Commit Log 等),确认没有找到服务 A 创建的那条指令数据的最终成功提交记录
    • (✓) 无显式删除逻辑: 通过代码审查,确认在服务 A 或服务 B 的正常业务逻辑以及异常处理逻辑中,没有显式编写 DELETE 语句来删除这条指令数据的代码。
编辑
2025-02-25
Docker
00

Docker 容器使用指南

大模型集成 LobeChat

大模型工具使用,需要设定返回格式新增一个JSON

编辑 settings.yml 找到 formats 在下面添加:

sh
formats: - html - json

一、引言

如果你打算使用 Docker 创建公共实例,推荐使用维护良好的 searxng/searxng @dockerhub 镜像。该 Docker 容器的源托管于 searxng - docker,容器内包含一个 HTTPS 反向代理(caddy)和一个 Redis 数据库。容器还对 SearXNG 进行了一系列配置,如启用限制器保护以防机器人攻击、启用图像代理以更好保护隐私、启用缓存破坏以节省带宽等。

原文Blog:https://docs.searxng.org/admin/installation-docker.html

二、获取 Docker

在打算自己构建和维护一个 Docker 镜像前,确保已经安装了 Docker。在 Linux 系统上,不要忘记将你的用户添加到 docker 组中(注销并重新登录以重新评估组成员身份),执行命令:

bash
sudo usermod -a -G docker $USER

三、使用 searxng/searxng 镜像

该 docker 镜像基于 git://Dockerfile,并可在 searxng/searxng @dockerhub 处获取。使用该 Docker 镜像非常简单,以下是拉取并部署本地实例的步骤:

3.1 创建并进入实例目录

bash
mkdir my-searxng cd my-searxng
编辑
2025-02-24
工具
00

Cherry Studio 助手配置指南

1. 注册硅基流动

请先访问 硅基流动 注册新用户账户。新用户将获得 15元额度

注意保护API请勿发送给别人

2. 下载安装包

  1. 访问以下链接下载 Cherry Studio 安装包: Cherry-Studio-1.0.0-setup.exe

  2. 或者自行去官网下载最新版本:(如果可以打开国外网站的话)

  3. 双击安装包,按安装步骤提示,安装到电脑上。

编辑
2025-01-26
工具
00

perplexity-color.svg

deepseek-color.svg

volcengine-color.svg

cogvideo-color.svg

编辑
2025-01-11
工具
00

该文章已加密,点击 阅读全文 并输入密码后方可查看。