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

两个并发主体持有IX锁时,IX锁能否升级为X锁?

关于InnoDB表级IX锁与DDL的X锁获取逻辑解答

首先明确结论:必须等该表上所有已持有的意向锁(IX/IS)、共享锁(S)、排他锁(X)全部释放后,才能成功获取用于DDL操作的表级X锁,无兼容例外情况。

具体运行逻辑如下:

  • DDL请求发起后,会首先向锁管理器申请表级X锁,只要此时表上存在任何活跃事务持有IX/IS/S/X任意一类锁,该X锁申请就会进入锁等待队列
  • 为避免DDL被持续涌入的DML请求堵死出现饥饿问题,锁队列中的X锁请求优先级会高于后续新来的DML的IX/IS锁申请,后续新的DML会排在X锁请求之后等待
  • 待所有在X锁请求发起前就持有IX锁的事务全部执行完毕(提交或回滚),它们持有的表级IX锁会被自动释放,此时等待队列中的X锁请求就能成功获取锁,DDL才会正式进入执行阶段

针对你提到的IX锁升级为X锁的疑问:
你的推导完全正确,InnoDB没有提供IX锁到X锁的升级机制。意向锁本质是事务对表级操作的前置声明,仅代表事务后续可能会修改表内的部分行,多个事务同时持有IX锁时,互相无法感知对方的行锁持有情况和后续操作计划,因此不可能支持锁升级,必须等所有其他持有该表意向锁的事务结束后,才能拿到X锁。

补充实际优化点:
目前MySQL支持的Online DDL仅在操作初始化、最终提交的两个极短阶段需要持有表级X锁,大部分执行阶段会降级为元数据共享锁,但初始化阶段的X锁申请仍然需要遵循锁兼容性规则,必须等所有旧的表级锁全部释放才能成功获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:48:04