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

为什么MySQL中表加IX模式锁时仍可执行行更新操作?

InnoDB 意向锁运行逻辑答疑

首先明确核心概念:意向锁是表级锁,但它的作用是标记事务有意图对表内的部分行加行锁,不会阻止其他事务的行级操作,仅会和全表级的读写锁冲突。

意向锁的兼容规则

InnoDB 设计意向锁的核心目的是为了提升加全表锁的判断效率,它的兼容逻辑如下:

  • 意向共享锁(IS)、意向排他锁(IX)互相之间全部兼容:任意事务持有表的IX/IS锁时,其他事务仍然可以正常申请同一个表的IX/IS锁
  • 意向锁仅和全表级的排他锁(X)、全表级的共享锁(S)冲突:只有当事务要执行LOCK TABLE 表名 WRITE/READ这类全表锁操作时,才会和已有的意向锁互斥。

你遇到的场景的具体运行逻辑

  1. 第一个事务执行带FOR UPDATE的查询时,会先给drivers表加IX锁,再尝试给符合car_id >5条件的行加X行锁。你的测试表中没有符合该条件的记录,所以该事务最终仅持有表的IX锁,没有持有任何行锁。
  2. 第二个事务执行UPDATE操作前,也会先申请drivers表的IX锁,因为IX锁之间互相兼容,所以可以顺利拿到。之后该事务申请id=1这一行的X行锁,第一个事务没有持有这一行的锁,所以更新可以直接执行成功。

常见误区澄清

你之前对表锁的认知更适用于MyISAM这类不支持行锁的存储引擎的全表锁,InnoDB的意向锁属于表级锁中的协调类锁,不会限制行级操作,它的存在是为了快速判断「当前有没有事务正在操作表内的行」,避免加全表锁时需要逐行检查是否存在行锁,大幅提升锁判断效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:08