记一次死锁问题的处理

记录排查一次线上的死锁问题 死锁问题出现 某天下午突然接到报警说是出现了死锁,当时的日志是这样的 问题排查 我们先来回顾一下死锁出现的条件 1、循环等待 2、互斥 此时看了下发布记录最近并没有什么功能上线,首先排除是上线代码质量问题引起的死锁。 之后查看当时日志定位死锁发生在业务线同步请求的后处理环节,后处理环节涉及到该张表操作的一共有三个环节:同步请求环节,合作... 阅读详情

总想写点技术积累。因为最近工作比较忙,一忙一懒,找足了借口 :(

今天想简单记录一下前段时间发现在做数据清洗时遇到的问题,在处理这件事情上,感受到了许多。

大概需求是这样的:有两组数据库,每组都是分库分表的结构。从两组库中查出数据,根据规则再进行入库、清除缓存、发送消息队列。数据有几千万。

遇到这样的问题,首先想到的就是在保证数据准确的情况下做并行处理,其次想到的是尽量降低数据库的压力,再次就是可重复执行。

大概是这么写的。伪代码:

staic Connection connA = new LongDbConnectionA();   // 不做自动关闭,只做查询操作

static Connection connB = new LongDbConnectinoB();   // 不做自动关闭,只做查询操作

CountDownLatch latch = new CountDownLatch(dbACount + dbBCount);

ExecutorService service = Executors.newFixedThreadPool(MAX_THREAD_NUM);

for(a;b;c) {

     service.submit(new BizRunnable()); // 具体的业务逻辑

}

latch.await();

service.shutdown();

log.info(result);


我使用了4个线程在本地做运行测试,在测试过程中偶尔发生程序hung住的问题。正好其他同学在这段时间反馈研发环境的数据库访问特别慢,所以我认为hung住也是数据库搞的鬼,也没去深究。

于是后续去线上执行了3次预跑,程序运行的很好,很快,根据日志分析也很ok,40个线程几分钟就跑完了。然后信心满满的去正式跑。

刚运行一会发现在服务器上神奇的hung住了!开始不相信是代码的问题,kill -9 pid,重来,因为可重复跑嘛。这次终于执行完成了,验证后数据正常。完事后手动clear了cache,发送消息队列。一番周章,有惊无险的搞定了事情。

但是这次在服务器上hung住绝对不可能认为是数据库的问题,那自然而然。于是跟我的头一起看代码,看了半天也没发现哪里出现了问题,感觉似乎都很正常,中规中矩的代码。

既然代码看不出来了,只能想别的办法了。回到研发环境我反复跑了几次,问题终于复现了,又见hung住。我确认还是代码的问题。于是再多次运行直到hung状态。用stack打印当前堆栈。果然,发现了deadlock。原来是最外层那个想节省数据库链接的主意导致了Connection的死锁:

Found one Java-level deadlock:
=============================
"pool-1-thread-4":
  waiting to lock monitor 0x000000000d8fb7d8 (object 0x000000078176ea50, a com.mysql.jdbc.JDBC4Connection),
  which is held by "pool-1-thread-1"
"pool-1-thread-1":
  waiting to lock monitor 0x000000000d8f8918 (object 0x00000007d75838b0, a com.mysql.jdbc.JDBC4ResultSet),
  which is held by "pool-1-thread-3"
"pool-1-thread-3":
  waiting to lock monitor 0x000000000d8f89c8 (object 0x00000007d7581ea0, a com.mysql.jdbc.JDBC4PreparedStatement),
  which is held by "pool-1-thread-1"



今天翻文件的时候


工作完成后,才定位到问题,这事是第一次用到。也有一些感悟:

1、不要太相信自己的代码;

2、遇到异常不要想当然,要真正的去定位问题,而不是凭借主观意识去决断;多做一步,消灭BUG;

3、不容易定位的死锁问题使用jstack可以很方便的找到根源;

4、别有侥幸心理,多测试不会死,测试不足会崩。崩了,丢人。。


【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包 激光雷达和相机联合标定(一)——ROS同步解包 阅读详情

相关推荐

超酷炫,Python实现交通数据可视化!

此时输出的栅格化参数params的内容存储了栅格坐标系的原点坐标(slon、slat)、单个栅格的经纬度长宽 (deltalon、deltalat)、栅格的旋转角度(theta)、栅格的形状(method参数,其值可以是方形rect、三角形tri和六边形hexa)以及栅格的大小(gridsize参数,单位为米)。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。今天分享一次Python交通数据分析与可视化的实战!

m0_59236127的博客 1697

锁 死锁 阻塞 Latch 等待 详解

锁这东西是纯概念性的东西,但是作用又非常大。 以前整理过两篇文章,今天又看了点书,觉得还不是很清楚。 就重新整理了下。 在想要不要把以前的文章删掉,这样在blog里是比较简介的,但后来又一想。 这些连接在其他的地方可能被引用了。 就决定还是保留着了,也算见证自己成长的一个过程。   ORACLE 锁机制 http://blog.youkuaiyun.com/xujinyang/article/detai

小宝老豆的专栏 4404

DEM数据下载,拼接,裁剪

目录: 1、数字高程模型(DEM)的数据下载 2、在ENVI里面进行拼接,生成SARscape标准格式的DEM数据3、在ArcGIS里面安装已有的矢量范文,进行掩膜裁剪 4、注意事项 数字高程模型的数据下载: 网址:http://dwtkns.com/srtm30m/ 1.对研究区域进行经纬度选择,然后进行选择下载即可 2.下载的数据是.hgt格式的,按照不同的需求进行转换,这里我是用于ENVI处理,且下载了四个,所有进行了拼接,拼接、格式转换如下 注:可能有时候需要登陆注册,点击下...

weixin_40874151的博客 2万+

多线程进阶(CountDownLatch,死锁,线程安全集合类)

6:同步工具CountDownLatch CountDownLatch:等待多个任务执行完毕 构造方法:给定计数 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); } 主要方法: //减少锁存器的计数,如果到0释放所有等待进程 public v

hd_cash的博客 1343

有了网段为什么还要有VLAN???

近几日,在学习VLAN及VXLAN方面的知识,对于产生原因做一个总结及详解。 VLAN(Virtual Local Area Network,虚拟局域网),其主要用途是用来缩小广播域,即进行隔离。 先对广播域的一个概念做如下描绘:如下图,主机A、B、C、D均连接在交换机SW1上,其中A、C同网段为192.168.252网段,而B和D同网段,为192.168.250网段。 现,假如A与C第...

dandandean_96的博客 6889

01 - 什么是SVM

摘要:SVM(共享虚拟内存)技术使CPU和GPU能共享同一虚拟地址空间,简化异构计算编程。传统模型需手动管理CPU/GPU内存和拷贝数据,而SVM允许直接传递指针,自动处理页面迁移和一致性维护。其核心包括统一地址空间、按需迁移、页面故障处理和一致性管理,显著降低编程复杂度并提升性能。通过HMM框架、MMU通知和GPU页面异常等机制实现高效内存共享,支持复杂数据结构,为异构计算带来便利。

图形/计算GPU的驱动与虚拟化技术分享园地 3138

JAVA并发编程--7 在编程过程中怎么避免死锁

在编程过程中怎么避免死锁

拽着尾巴的鱼儿的博客 603

【新能源汽车测试工程师必看!DBC文件50条实战技巧,看懂这篇直接封神】

如果你是新能源汽车研发/测试工程师,还在为信号解析错误、报文找不到、DBC看不懂、实车故障复现不了头疼——那这篇文章,你一定要!在整车电控开发里,DBC = CAN总线的官方字典。没有DBC,报文就是一串乱码;读不懂DBC,测试寸步难行;用不好DBC,排查故障全靠猜。本文总结50条全网最实用、最贴近实车、最能解决问题的DBC技巧,从基础语法到新能源专用信号,从工具操作到故障排错,全部来自一线台架、实车、高压平台实战经验。不废话、不空谈、不玄学,全是能直接落地的硬货!

优快云-新能源汽车研发测试专业博主 1373

线程池-一种引起死锁现象的使用方式

异步并发场景下,父子任务使用同一个线程池,将可能引起死锁现象。

小蜗牛的博客 703

数学建模学习(75):全局敏感性分析Morris 方法

敏感性分析 (SA) 是分析不同应用条件下模型行为的基本实践。提出了许多 SA 技术,从简单的筛选方法到计算成本高昂的基于方差的方法。本篇内容我们通过将 Morris 方法来对模型进行分析。

全栈川川 1万+

10分钟搞定manim安装与vscode配置

manim安装与vscode配置

帅帅de三叔 3413

JAVA知识体系之问题处理篇(一)——记一次神奇的mysql死锁排查过程

1、问题   由于公司业务和技术性需求,新上线一个独立支付系统,其中部分退款功能在进行并发测试时出现偶发性mysql死锁: [2021-09-22 15:46:18,760][c.b.a.s.i.ReverseServiceImpl][thread0][ERROR][816fbe90-a4fa-4dea-b52c-719f1f2a8c37][]call [ReverseServiceImpl][refund] EXCEPTION:Cause[org.springframework.dao.DeadlockL

qsmiley10的博客 655

Python 爬虫实战:简易爬取知乎回答内容

本文详细介绍了使用Python爬取知乎回答内容的实战方法。通过分析知乎异步加载API接口,讲解如何构建带反爬策略的爬虫代码,包括请求头设置、JSON数据解析和内容清洗等核心步骤。文章提供了完整可运行的代码示例,并针对多页爬取、数据保存和反爬升级给出优化建议。同时强调爬虫使用的合规性,帮助新手快速掌握动态网页爬取的核心技巧,实现从静态到动态网页爬虫的进阶。

2503_91057718的博客 2197

一次彻底讲清如何处理mysql 的死锁问题

MySQL 死锁是数据库在并发场景下常见的问题,特别是对于大规模、复杂的业务系统,死锁问题更为频繁。通过合理的索引设计、保持加锁顺序一致、缩短事务时间、优化锁策略等手段,可以有效减少死锁的发生。同时,当死锁发生时,MySQL 具备死锁检测和自动回滚机制,开发人员可以通过合理的异常处理和重试机制,来提高系统的稳定性和可靠性。lgx211引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构。

kfashfasf的博客 2735

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

记一次生产环境死锁问题分析

INNODB_TRX 表提供了当前在 InnoDB 内部执行的所有事务信息,包含事务是否在等待锁,事务何时开始以及事务正在执行的SQL语句(如果有的话,sql语句阻塞就可以显示)。在处理完上面的死锁问题后,生产环境还是经常卡死,怀疑还有其他地方有死锁问题,但是根本找不到,奇怪的是测试环境一切正常,就是生产环境经常卡死,最后通过日志分析,发现老是卡在使用。最近在做的项目中生产环境频繁出现数据库死锁的问题,解决一个,又来一个,最后数据库不死锁了,多了个请求文件服务器永久阻塞的问题,也是折腾了许久才解决掉。

zhang33565417的博客 1774

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

记一次线上SQL死锁事故:如何避免死锁?

转载自 极客时间- Java性能调优实战 刘超 记一次线上SQL死锁事故:如何避免死锁? 之前我参与过一个项目,在项目初期,我们是没有将读写表分离的,而是基于一个主库完成读写操作。在业务量逐渐增大的时候,我们偶尔会收到系统的异常报警信息,DBA 通知我们数据库出现了死锁异常。 按理说业务开始是比较简单的,就是新增订单、修改订单、查询订单等操作,那为什么会出现死锁呢?经过日志分析,我们发现是作为幂等性校验的一张表经常出现死锁异常。我们和 DBA 讨论之后,初步怀疑是索引导致的死锁问题。后来我们在开发环境中模拟

张俊杰 的博客 1344

记一次死锁问题

最近在做一个需求,碰到了死锁的问题,记录下解决问题的过程。

装睡的小5郎的博客 590

记一次死锁处理

最近做了个记录用户行为操作记录的功能,并要最终展示处理,出于各种原因,将数据库表设计了个唯一索引,包含三个字段,start_id,type,time,其中start_id唯一标识一个用户进入app的一次会话,type表示其具体的操作行为,time即时间戳。 Create Table: CREATE TABLE `footrecord` ( `id` bigint(20) NOT N...

superior_stone的博客 274

mysql update 死锁_记一次mysql的update死锁

2019.11.20 账户系统死锁问题排查分析。问题出现项目出现死锁告警,日志中出现报错:Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting t...

weixin_32200329的博客 4556

记一次Insert死锁

前言:本文为笔者自己对线上出现的一次死锁进行的分析,欢迎指正。 异常 线上跑自动化测试时,出现了异常: org.springframework.dao.DeadlockLoserDataAccessException: ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try

空槐树的博客 905

记一次MYSQL死锁 排查

项目报了一个死锁异常 org.apache.ibatis.exceptions.PersistenceException: ### Error flushing statements. Cause: org.apache.ibatis.executor.BatchExecutorException: com.baturu.wms.business.outbound.dao.OutboundNoticeHeaderDao.updateById (batch index #1) failed. Cause: j

超级小粿的空间 3091

记一次Redis Cluster Pipeline导致的死锁问题

本文介绍了一次排查Dubbo线程池耗尽问题的过程。通过查看Dubbo线程状态、分析Jedis连接池获取连接的源码、排查死锁条件等方面,最终确认是因为使用了cluster pipeline模式且没有设置超时时间导致死锁问题。

vivo互联网技术 1100

记一次由delete语句导致的MySQL死锁分析

公司某个业务是视频会议方向的,在执行业务的自动化测试的过程中,发现会出现偶发性的创建会议失败的问题。查看业务日志发现,竟然发生了死锁:Deadlock found when trying to get lock; try restarting transaction Caused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackEx...

架构文摘 3962

记一次sqlserver 死锁排查exchangeEvent

记一次系列再更新,这次是死锁排除~ 数据库死锁这个东西,一般碰到这个都会觉得头皮发麻,不知道怎么处理, 然后看了几篇文章以及sqlserver的官方文档后往往都会很蒙蔽,根本不知道在说什么 但是在最近的一次死锁中,我逐渐明白了一些,在这里分享下 死锁原因: 不仅是数据库死锁,任何多线程都会死锁,而原因其实都是一个,那就是两方资源竞争僵持不下,就一直相互等待,为什么是2方,死锁的形成必须由两方竞争造成,一方不能形成,这里拿现实点的比喻, 有2个盲盒A和B,每个盒子只有一个口子允许拿手进去摸 这.

qq_25002077的博客 893
上一篇: 设计模式学习笔记十:构造器模式
下一篇: 三次握手,四次挥手及半关闭
七郎
博客等级 码龄14年 31粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值