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

技术疑问:InnoDB底层是否也会使用表锁?

InnoDB是否会使用表锁?

是的,InnoDB确实会在底层使用表级锁,但这类表锁通常是意向锁(Intent Lock),和传统意义上阻塞全表操作的表锁逻辑不同。

意向锁的作用

意向锁是InnoDB为了协调行锁与表锁的冲突检查而设计的机制:它的核心目的是快速告知其他事务「当前表内已有行级锁存在」,避免其他事务执行全表锁操作时需要逐行扫描检查锁状态,大幅提升锁冲突检查的效率。

结合你的操作案例分析

你执行的SELECT ... FOR SHARE语句会触发以下锁逻辑:

  1. 先对world.city表添加IS(意向共享锁)
  2. 再对ID=130的行添加S,REC_NOT_GAP(共享记录锁,无间隙锁)

你的操作与观测结果如下:

-- Connection1操作
BEGIN;

SELECT *
FROM world.city
WHERE ID = 130
FOR SHARE;
-- Connection2查询锁状态
SELECT engine, thread_id, object_schema,
object_name, lock_type, lock_mode,
lock_status, lock_data
FROM performance_schema.data_locks;

查询结果:

+--------+-----------+---------------+-------------+-----------+---------------+-------------+-----------+
| engine | thread_id | object_schema | object_name | lock_type | lock_mode     | lock_status | lock_data |
+--------+-----------+---------------+-------------+-----------+---------------+-------------+-----------+
| INNODB |       130 | world         | city        | TABLE     | IS            | GRANTED     | NULL      |
| INNODB |       130 | world         | city        | RECORD    | S,REC_NOT_GAP | GRANTED     | 130       |
+--------+-----------+---------------+-------------+-----------+---------------+-------------+-----------+

关键说明

  • IS意向锁不会阻塞其他事务的普通行锁操作,也不会阻塞其他事务添加IS/IX(意向排他锁)
  • 只有当其他事务尝试添加全表级排他锁(比如LOCK TABLE ... WRITE)时,IS锁才会触发阻塞,防止全表锁与已存在的行锁发生冲突

简言之,InnoDB的表级锁是行锁机制的辅助组件,并非用来限制行级并发的全表锁,你观测到的IS锁就是这种意向锁的典型表现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:55:18