表锁锁定整表,开销小但并发低,MyISAM默认使用;行锁仅锁操作行,InnoDB支持,依赖索引,提升并发性。

在MySQL中,行锁和表锁是两种不同的锁机制,用来控制多个事务对数据的并发访问。理解它们的关键在于锁定的粒度和并发性能之间的权衡。
什么是表锁
表锁是MySQL中最粗粒度的锁机制,它会锁定整张表。当一个事务对某张表加上表锁后,其他事务无法对该表进行写操作,甚至在某些情况下也无法读取。
特点:
- 锁定范围大:一次锁住整张表,开销小,加锁快
- 并发性低:即使只操作一行,也会阻塞其他事务对整表的操作
- 自动管理:MyISAM引擎默认使用表锁,InnoDB在特定语句下也可能升级为表锁(如没有索引的查询)
常见场景:
- 执行ALTER TABLE时会加表锁
- 全表扫描且无合适索引时,InnoDB可能使用表锁
什么是行锁
行锁是InnoDB引擎支持的更细粒度的锁,它只锁定需要操作的具体行,其他行仍可被其他事务访问,从而提高并发处理能力。
JTBC CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也
特点:
- 锁定粒度小:只锁住涉及的行,支持高并发
- 开销大:加锁和释放锁的机制更复杂,可能产生死锁
- 依赖索引:行锁通过索引项实现,若查询未命中索引,可能退化为表锁
实际例子:
- 执行UPDATE users SET name='Tom' WHERE id=1;时,InnoDB会对id=1的这一行加行锁
- 其他事务仍可操作id=2、id=3等记录
行锁与表锁如何选择
通常不需要手动选择,由存储引擎和SQL语句自动决定:
- MyISAM只支持表锁,适合读多写少的场景
- InnoDB默认使用行锁,适合高并发写操作
- 确保查询条件走索引,避免行锁升级为表锁
- 长时间持有行锁可能引发锁等待或死锁,需合理设计事务大小
基本上就这些。掌握行锁和表锁的区别,关键看锁定范围和并发影响。InnoDB的行锁提升了并发效率,但也带来更复杂的锁管理。合理使用索引、控制事务长度,才能发挥行锁的优势。









