前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一次MySQL死锁排查过程

记一次MySQL死锁排查过程

作者头像
Michel_Rolle
发布2023-07-30 16:40:53
2.5K0
发布2023-07-30 16:40:53
举报
文章被收录于专栏:golang分享

背景

大概说一下业务场景,需要定时计算一些数据,从其他系统、接口拉取达到的数据比较多,然后经计算后的值存储在本系统中。拉取的数据量可能有万左右,然后以主键存在的数据是需要更新的。不存在则插入。每次做全量更新/插入。

起因

最开始采用的方法是先查询,数据存在则更新数据,不存在则插入数据。但是数据要求的时效性比较高。于是定时任务在做任务处理的时候频率就比较高了。就出现了单位时间内对数据库的读写高,于是就换了一个方法。用INSERT … ON DUPLICATE KEY UPDATE。

对数据库的读写次数虽然比之前少了,但是又引发了一个新的问题,因为更新、插入的数据量多,所以导致与一条INSERT … ON DUPLICATE KEY UPDATE的执行时间有点长,大概5s,去研究了下。实际上一次批量插入几千条条数据。为了解决这个问题,就分组批量查询,分为了每 50 条数据一组,这样每条sql 执行的时间也就短了。

随之又出现了另外一个问题,随着数据量的增加,一次循环拉取的数据经计算,写入,更新等。时间大于定时任务所处理的时间,这样就导致与上一个定时任务还没处理完的时候,下一个定时任务又进来处理数据了。

于是选择的做法是在每处理一组数据的时候,把 redis 的key 延长一点时间。然后整组数据处理完的时候,再删除 redis 的 值。等下一次定时任务抢到锁了再进来处理。

想到的第二个方案是,直接插入数据库,主键冲突就抛错,根据指定的错来更新值

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 起因
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档