记一次生产事故的排查和解决

一. 事故概述

春节期间, 生产系统多次出现假死不可用现象, 导致绝大部分业务无法进行. 主要表现现象为接口无法访问.

背景为900W+客户表和近实时ES, 以及春节期间疫情导致的普通卖菜场景近似秒杀等.

二. 排查过程

优先排查了info, error, catalina日志, 发现以下异常:

1.png

3.png

主要的异常信息为:

Cause: java.sql.SQLException: Lock wait timeout exceeded; 
try restarting transaction

引起该异常通常是由高频行锁或表锁同时操作数据库导致. 上一次事务还未完成, 新的事务尝试获取锁等待超时.

但根本原因是业务涉及缺陷或代码不合理导致的事务无法正常提交或事务体执行时间过长. 引起获取锁等待超时.

参考异常中的业务代码, 如1图中的库存扣减逻辑, 和2图中的购物车逻辑.

  1. 排查代码时发现库存扣减存在业务上设计的不合理, 原业务为在支付回调时扣减库存, 造成超卖现象很严重(甲方允许超卖), 扣减在update语句中实现, 库存字段为unsigned, 所以负数抛出异常导致事务无法正常提交.
  2. 在创建订单时的大事务体中包含购物车删除逻辑, 有很多查询, 创建, 删除操作数据库的逻辑, 在近秒杀场景中, 高频商品的记录被阻塞在事务中, 最终导致其他线程获取锁超时.

三. 解决方案

比较主流的处理方案是查询以下几张表, 删除事务表中无法正常释放的事务锁记录

information_schema.INNODB_TRX;
information_schema.INNODB_LOCKs;
information_schema.INNODB_LOCK_waits;

但基于事故发生的时间和严重程度, 该方案只能治标, 不能治本.

所以根据异常中两处不同的业务代码入手

发现共同点: 均存在大事务代码体, 个别业务存在事务期间刷新ES操作.

解决方案如下:

  1. 异步化刷新ES.
  2. 降低事务体大小和数据库操作, 将非强一致性要求的操作移到事务外.
  3. 酌情去除事务.
  4. 优化畸形代码(特指历史遗留或未经review的脏代码)
  5. 查询类接口考虑读写分离
  6. 利用缓存合理规避高频业务对数据库带来的压力
  7. 对于代码提交做把控, 有效的review可以减少脏代码的产生.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661756.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言——单链表实现数据增删查改

一.前言 嗨嗨嗨,我们又见面了。前面我们已经学习了关于数据结构中的顺序表,今天我们来学习数据结构中的单链表。废话不多说让我们直接开始吧。 二.正文 1.1链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺…

【Flask开发实战】HTML模板代码复用之extends使用

一、前言 在 HTML 开发中,尤其是在使用模板引擎(如 Jinja2,常用于 Flask 应用)时,extends 是一个非常有用的指令,它用于实现模板继承,从而达到代码复用的目的。这可以让你定义一个基本模板&…

三体中的二向箔

目录 描述 外观 基本原理 攻击范围及影响 副作用 保存方式 实战情况 二向箔是在中国科幻名匠刘慈欣的作品《三体3:死神永生》中登场的宇宙规律武器之一。首次出现于一艘来自歌者“母世界”的宇宙飞船。由于宇宙战争愈演愈烈,二向箔对于高等文明而…

Codigger数据篇(下):数据安全的全方位保障

在数字化浪潮中,数据已成为现代企业的核心财富。Codigger作为领先的数据服务平台,深知数据安全对于用户的重要性,因此在深挖数据价值的同时,我们始终坚守数据安全防线。 一、双重加密技术保障 Codigger平台运用先进的加密通信和…

python 基础语句

python 基础语句 1. import 语句 用于导入相应的包以供后面的代码使用 import xxx -将xxx包导入import pandas as pd - 导入 pandas 包并且将其所有的对象、方法、属性赋予 pd 对象from xxx1 import xxx2 - 从xxx1 包中导入 xxx2 方法 2. 输入输出语句 input,pr…

ip ssl证书无限端口网站

IP SSL证书是由CA认证机构颁发的一种特殊数字证书。大部分SSL数字证书都需要用户使用域名进行申请,想要对公网IP地址加密实现https访问就需要申请IP SSL证书。IP SSL证书采用了强大的加密算法,可以有效地防止数据在传输过程中被窃取或篡改,具…

TS学习-泛型基础

目录 1,介绍1,在函数中使用2,在类型别名,接口中使用3,在类中使用 2,泛型约束3,多泛型4,举例实现 Map 1,介绍 泛型相当于是一个类型变量,有时无法预先知道具体…

药品商品名/通用名/化学名/别名-数据库查询方法

药品通用名-药品化学名-药品商品名的区别 药品通用名通常是由药典委员会或相关药品命名机构根据药品的化学成分或治疗特性制定的标准化名称。这个名称在科学和医疗领域中用于确保对药品的准确和一致性识别。如阿司匹林(Aspirin)是药品的通用名。&#x…

Tomact安装配置及使用(超详细)

文章目录 web相关知识概述web简介(了解)软件架构模式(掌握)BS:browser server 浏览器服务器CS:client server 客户端服务器 B/S和C/S通信模式特点(重要)web资源(理解)资源分类 URL请求路径(理解)作用介绍格式浏览器通过url访问服务器的过程 服务器(掌握)…

Vue.js课后练习(登录注册和大小比较)

第一题 请编写登录页面和注册页面&#xff0c;通过动态组件实现动态切换页面中显示的组件&#xff0c;效果如图1和图2所示。 图1 登录页面 图2 注册页面 代码&#xff1a; my.vue代码: <template>登录 </template><script setup> </script><st…

maven聚合,继承等方式

需要install安装到本地仓库&#xff0c;或者私服&#xff0c;方可使用自己封装项目 编译&#xff0c;测试&#xff0c;打包&#xff0c;安装&#xff0c;发布 parent: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…

PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头视频图像叠加

链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 什么是视频水印&#xff1f; 视频水印就是图像叠加&#xff0c;跟画中画&#xff0c;或者是OSD是一样的原理&#xff0c;都是在视频的行场数据流上进行替换操作&#xff0c;比如叠加可以直接用水印图的数…