一个接口未做超时处理,引发数据库hang了

前言

在代码开发过程中,你是否会经常遇到以下问题?

  • 数据库连接被瞬间占用,出现性能瓶颈

  • 系统资源被大量占用,出现锁等待或性能下降

  • 事务日志大量增长

上述这些状况的出现可能是未提交事务引发的。该类事务开启后,长时间未向数据库发出SQL执行请求事务处理(COMMIT/ROLLBACK)请求,会对数据库的稳定性和性能产生重大影响。本文我们将详细分析未提交事务的原因,并提供有效的排查和解决方案。

一个接口未做超时处理,引发数据库hang了

近期,一位开发小伙伴给我们反馈说,他在进行事务处理时,尝试调用了一个第三方接口,且未对这一调用过程增加超时限制。在某天第三方服务突然发生异常,导致接口响应变慢,当前事务迟迟未提交,直接导致产生了大量未提交事务,数据库直接hang住了!

图片

上面简化后的代码,我们能看到通过注解@Transactional开启事务,执行update完成后,开始调用第三方接口,这个时候相当于卡住了,后面的代码迟迟得不到执行。而业务针对该接口会频繁操作,相当于数据库会有大量未提交事务,导致大量资源占用、长时间锁占用产生大量锁等待、连接数暴涨、系统性能急剧下降等问题。

对于运维DBA来说,从数据库层面只能看到很多处于Sleep状态的连接且看不到具体SQL,问题排查起来比较困难。

最终DBA通过终极大招重启数据库解决了该问题。

哪些场景会触发未提交事务?

造成未提交事务的原因有多种可能,以下是几种常见的触发场景:

1.存在复杂查询或计算:有些事务可能需要执行复杂的查询、计算或批量操作。这些操作通常需要较长时间才能完成,在整个过程中,事务保持未提交状态,直到所有操作完成并且事务提交。

2.存在长时间运行的批处理任务:在一些批处理任务中,可能会有大量数据需要处理。为了确保数据处理的原子性和一致性,这些操作通常会在一个事务中进行。在整个批处理任务完成之前,事务会保持未提交状态。

3.事务锁等待:如果事务在执行过程中需要等待其他事务释放锁,它会保持未提交状态,直到锁被释放并且操作可以继续。

4.事务中需访问第三方服务:事务开启后,与第三方交互,严重依赖第三方业务执行的速度,大大增加事务时长 。

如何快速排查未提交事务?

当运维DBA遇到此类问题时,会通过SHOW PROCESSLIST或者INNODB_TRX来进行未提交事务分析。下面我们手动模拟创造了一个未提交事务:

图片

图片

从上面的图中,通过SHOW PROCESSLIST可查看会话状态,但是看不到会话90323的具体SQL,只能看到一条处于Sleep状态的连接会话,没有详细SQL很难定位是哪个业务逻辑异常导致的。

利用DBdoctor进行未提交事务的快速诊断

使用DBdoctor纳管实例后,会对该实例实时主动诊断(包含未提交事务),我们可以在实例诊断->锁透视->未提交事务tab页中进行列表查看,点击指定未提交事务『查看事务详情』,即可通过泳道图的形式慢动作回放事务SQL的完整执行过程。

图片

未提交事务列表支持锁下砖,点击上图中会话ID小箭头可以展示该未提交事务引发哪些SQL发生了锁等待,如果存在锁等待SQL,那说明业务开发同学要对该未提交事务做紧急优化了,对于DBA同学只需要将该未提交事务的会话ID进行kill即可完成紧急救火。

总结

偶尔的一条未提交事务在线上可能不会造成业务异常,但如果哪天需要对涉及该事物的表做DDL变更,那么可能引发故障(未提交事务占用了元数据锁,会导致涉及该表的所有SQL被阻塞)。利用DBdoctor锁透视功能,可帮助开发及运维DBA快速‌识别数据库是否存在未提交事务,DBA可以紧急救火,业务开发同学可基于泳道图快速异常代码定位并优化,彻底解决该问题,赶快下载试用吧!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

什么是五力分析?5分钟带你了解它在企业财务经营中的应用与价值!

如今,随着全球化进程的不断加速,市场环境复杂多变,市场竞争日益激烈,财务经营已经成为了企业应对复杂市场环境、保持自身竞争力的关键。体系化的五力分析平台能够为企业提供一套全面的解决方案,帮助企业在盈利能力、偿…

【随机链表的复制】python刷题记录

R3-哈希表 参考k神题解 哈希表法: """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:def copy…

Java红娘相亲交友平台系统源码小程序

💕遇见真爱,从“红娘相亲交友平台系统”开始!👫 🌹【精准匹配,缘分不再擦肩而过】 还在为茫茫人海中找不到那个TA而烦恼吗?“红娘相亲交友平台系统”利用先进的大数据分析技术,根据…

电脑怎么压缩图片?6个简单实用的压缩方法分享(无损压缩)

电脑怎么压缩图片?面对电脑较大的图片,小编是建议大家进行压缩的。文件过大容易影响电脑存储空间,而且还不容易上传和传输。图片压缩有很多方法可以有效解决,简单几步就能将图片压缩变小,下面是相关的介绍,…

web期末大作业家乡-浙江

代码下载: https://pan.quark.cn/s/2e157769c4ad

android动态权限申请并告知权限申请的使用目的

随着工信部对APP的一系列整治,现在要求APP在申请相机、位置等敏感权限时需要向用户同步告知权限申请的使用目的。个大应用市场在APP上线审核中也会重点检查这项要求。 从Android 6.0开始,对于敏感权限的获取,APP需要调用系统提供的动态申请权…

借银行的贷款去还网贷,可以吗?

近日,有很多网友问我,他们申请的公积金贷款,能不能用这笔钱来还清信用卡和网贷,但又怕这么做会违法,或者银行会突然要求他提前还贷。 首先,放心,这么做不违法。但银行确实不太鼓励这么用贷款&am…

【扒模块】DFF

图 医学图像分割任务 代码 import torch import torch.nn as nnfrom timm.models.layers import DropPath # 论文:D-Net:具有动态特征融合的动态大核,用于体积医学图像分割(3D图像任务) # https://arxiv.org/abs/2403…

嵌入式开发问题总汇

1. 事情经过:有天快下班的时候,我们采购经理找到我,说,生成的bin文件通过软件上传烧录时,烧录就会重启,但是其他的板子就不会。最后他换了一个A厂家的flash芯片,就可以了。但是,B厂…

整箱排柜不返工?用易境通散拼系统就OK

想必困扰散货拼柜小伙伴们一大难题就是,怎么把错乱纷繁的货物有序地整箱排柜,并且要保证集装箱高效利用,运输成本尽量降低。这不仅要求操作者具备卓越的统筹规划能力,更需长期积累的实践经验和敏锐的应变能力。易境通散拼系统可以…

SSM城市垃圾分类管理系统-计算机毕业设计源码44582

摘 要 在当前全球环境问题日益突出的背景下,城市垃圾分类成为推动可持续发展和环境保护的重要举措之一。然而,传统的垃圾处理方式存在效率低下、资源浪费和环境污染等问题。因此,开发一个基于Java编程语言、MySQL数据库和HTML前端技术的高效…

前缀和与差分大总结!!!C++

学了忘忘了学o(╥﹏╥)o 题源acwing 讲解前缀和一维,用于序列二维,用于矩阵 讲解差分什么是差分数组?一维差分数组二维差分数组 题目一:前缀和题目二:子矩阵的和题目三:差分题目四:差分矩阵 讲…

中电金信:金融机构企业级客户中心建设指南

客户中心系统(ECIF​)承担了数字化转型的重要使命,管理和认识客户是内部运营和外部监管的共同需求。更为重要的是,客户数据需要全场景地参与到数字化运营中,几乎所有业务都围绕着客户展开,几乎所有场景都需…

无人机技术已应用至地理测绘,Infortrend存储助力测绘数据

--高扩展保存海量无人机数据,高性能支持快速调取建模,数据安全也有免费的备份功能,实实在在好用的存储设备。

KeePass密码管理工具部署

KeePass密码管理工具部署 安装包下载入口 双击执行,根据提示完成安装: 安装完成后如图:

什么是邮件安全证书?如何获取邮件安全证书?

国内药企要想获得GMP认证,除了需满足FDA对药品的审核标准之外,还明文规定需要使用邮件安全证书(S/MIME证书)与之进行加密邮件沟通。那么什么是邮件安全证书?如何获取邮件安全证书? 什么是邮件安全证书&…

C++ 右值 左值引用

一.什么是左值引用 右值引用 1.左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址可以对它赋值。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左…

Java扫码点餐系统奶茶店类型堂食配送小程序源码

🥤【奶茶新风尚!扫码点餐系统,堂食配送两不误】🥤 🏠【堂食新体验:一键下单,即享美味】🏠 踏入心仪的奶茶店,不再需要排队等候点单,只需拿起手机&#xff0…

18730 涂色问题

这个问题可以通过动态规划来解决。我们可以定义一个状态dp[i][j],表示前i个牛舍中最后一个牛舍的颜色是j的涂色方案数量。然后我们可以通过状态转移方程来更新dp[i][j]。 状态转移方程如下: dp[i][j] dp[i-1][k] (k ! j) 然后我们需要对所有的dp[i][…

【iOS】—— iOS持久化

iOS持久化 1. 数据持久化的目的2. iOS持久化的方案3. 数据持久化方式的分类内存缓存磁盘缓存 4. 沙盒机制5. 沙盒的目录结构获取应用程序的沙盒路径每次编译代码会生成新的沙盒路径,每次运行获得的沙盒路径都不一样。访问沙盒目录常用C函数介绍沙盒目录介绍 6. 持久…