当前位置: 首页 > news >正文

一条mysql数据库更新语句

发生场景:车间产出记录进行出库

国庆节前下班的时候,生产部门生产完进行入库,这个时候正常跑我们的业务XXXX——直接到根据单件档案的单件号更新单件档案上的最终用户信息时候出现了问题,跑着跑着就超时,这个时候就进行问题排查

1、首先怀疑是大量数据操作时候怀疑是不是有锁表情况发生,但是跟踪了下数据库并没有发生锁表的现象
2、排除锁表情况,然后开始跟踪整个业务的sql,排查哪条sql出现了超时
3、最终排查到是一条更新语句,回写最终用户时候那条update 超时了,在执行到第51s时候出现等待超时nnodb_lock_wait_timeout

原因分析

先来看下这条更新的sql,其中使用了case when

<update id="updateSn">update a1<trim prefix="set" suffixOverrides=","><trim prefix="C01 =case" suffix="end,"><foreach collection="list" item="i" index="index"><if test="i.sn != null">when a1.sn = #{i.sn} then #{i.finalUser,jdbcType=VARCHAR}</if></foreach></trim><trim prefix="C02 =case" suffix="end,"><foreach collection="list" item="i" index="index"><if test="i.sn != null">when a1.sn = #{i.sn} then #{i.cpType,jdbcType=VARCHAR}</if></foreach></trim></trim>where a1.sn in<foreach collection="list" item="i" index="index" open="(" separator="," close=")">#{i.sn,jdbcType=VARCHAR}</foreach></update>

原因是list里面有上万条数据,就会造成如下情况

update a1
set C01 = case when a1.sn = 'SN001' then '张三' when a1.sn = 'SN002' then '李四' ......................end,C02 = case when a1.sn = 'SN001' then '类型A' when a1.sn = 'SN002' then '类型B' ......................end
where a1.sn in ('SN001', 'SN002',.........)

排查说明

从而造成的直接原因就是这条更新语句太过庞大,执行50s后依然没有能结束,那么就会出现超时的异常,原因是UPDATE 语句在执行时会对涉及的行 / 表加锁(InnoDB 引擎默认行级锁),如果其他事务已持有相关锁(如未提交的更新、删除操作),当前 UPDATE 会进入锁等待状态。当等待时间超过 innodb_lock_wait_timeout(默认 50 秒)时,就会触发超时(Lock wait timeout exceeded 错误)

select操作一般不会有这个情况,因为默认情况下(非 FOR UPDATE 或 LOCK IN SHARE MODE),InnoDB 使用快照读(借助 MVCC 机制),不会加锁,也不会等待其他事务释放锁,因此可以长时间运行而不触发锁等待超时

这个时候修改代码来不及,因为不能让系统重启,所以让业务部门减少数据量,分批操作。。。。方法可能比较笨,但是能保证业务顺利入库,进行后续操作

后续优化

数据量太大,分批次执行,每次1000条更新一次

这样写的有点

http://www.hskmm.com/?act=detail&tid=22101

相关文章:

  • 浅谈递归入门(1) - 指南
  • python+uniapp基于微信小工具的医院陪诊预约系统
  • [深度学习] 大模型学习5-高效微调框架Unsloth使用指北
  • 【APK安全】组件安全核心风险与防御指南 - 详解
  • 前端-JavaScript简介JavaScript模块化 - 努力-
  • 基本地址变换机构
  • 2025工业网线厂家权威推荐榜:千兆/拖链/高柔/网线/六类/超五类/6类/超5类/千兆/超六类/8芯/4芯/成品/相机/视觉数据工业网线高强屏蔽与稳定传输实力之选
  • gitee 使用安装教程
  • VisualMimic——基于视觉的人形行走-操作控制:低层策略负责平衡控制且跟踪高层下发的指令、高层策略则基于自我中心视觉输入生成任务跟踪指令 - 实践
  • 基本分页存储管理的基本概念
  • luogu P6503 [COCI 2010/2011 #3] DIFERENCIJA
  • 详细介绍:自动化接口框架搭建分享-pytest第三部分
  • Solon Plugin 自动装配机制详解
  • 2025宅基地纠纷律所权威推荐榜:专业调解与胜诉保障实力之选
  • 2025上海骨灰盒哪里买优质厂家权威推荐榜:匠心工艺与品质服务之选
  • 实用指南:华为 HCIA-Datacom 备考:VRP 通用路由平台原理-实操
  • Voice Agent Camp 结营!完整项目名单公布丨超音速计划 2025
  • 2025上海寿衣哪里买权威推荐:优质供货商与暖心服务之选
  • AI 真能胜任专业工程师的工作吗?
  • 容器中与内存相关的几个参数
  • 第一次软工作业
  • OpenWRT中备份多个docker容器的脚本 -
  • 动态分区分配算法
  • 上海殡葬一条龙服务权威推荐:寿衣、骨灰盒购买定制服务暖心陪伴与专业仪式之选
  • potplayer截图
  • OpenAI发布提示词集
  • 303、杂诗
  • 完整教程:第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】
  • 微信小程序开发 - MrFlySand
  • 电脑性能优化综合指南:从网络到硬件的不全面解答