You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询等待表元数据锁始终不超时的原因排查

为什么InnoDB表的SELECT查询等待元数据锁时不超时?

你遇到的问题核心是锁类型与对应超时参数不匹配:

  • innodb_lock_wait_timeout仅控制InnoDB行级锁的等待超时时间,对你当前遇到的**表元数据锁(MDL)**完全无效。
  • 控制MDL锁等待超时的是全局参数lock_wait_timeout,MySQL 8.0默认值为31536000秒(约1年),这就是你的SELECT查询会无限挂起的原因。

补充说明:

  1. lock tables my_table write;会获取该表的MDL写锁,而select count(*) from my_table;需要获取MDL读锁。MDL锁的规则是写锁会阻塞所有后续读锁请求,因此后者会进入等待状态。
  2. 若要修改MDL锁的等待超时时间,可执行:
    set global lock_wait_timeout = 5;
    
    注意:修改全局参数后需重新连接客户端才会生效,若要永久生效需在my.cnf(或my.ini)中添加配置:
    lock_wait_timeout = 5
    

内容的提问来源于stack exchange,提问作者mgiuffrida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:40:24