技术疑问:InnoDB底层是否也会使用表锁?
InnoDB是否会使用表锁?
是的,InnoDB确实会在底层使用表级锁,但这类表锁通常是意向锁(Intent Lock),和传统意义上阻塞全表操作的表锁逻辑不同。
意向锁的作用
意向锁是InnoDB为了协调行锁与表锁的冲突检查而设计的机制:它的核心目的是快速告知其他事务「当前表内已有行级锁存在」,避免其他事务执行全表锁操作时需要逐行扫描检查锁状态,大幅提升锁冲突检查的效率。
结合你的操作案例分析
你执行的SELECT ... FOR SHARE语句会触发以下锁逻辑:
- 先对
world.city表添加IS(意向共享锁) - 再对
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
相关产品推荐
相关产品推荐

