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