MST

星途 面试题库

面试题:MySQL 锁优化中如何合理选择锁粒度

在 MySQL 数据库中,锁粒度对性能有显著影响。请阐述行锁、表锁和页锁的特点,并举例说明在不同业务场景下,如何合理选择锁粒度以优化锁的性能。
13.6万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

行锁特点

  • 锁的粒度最小:只针对操作的行进行加锁,对并发事务的影响最小。
  • 并发性能高:多个事务可以同时操作不同行,减少锁冲突。
  • 开销大:由于锁的粒度精细,加锁和解锁的开销相对较大。

表锁特点

  • 锁的粒度最大:对整个表进行加锁。
  • 开销小:加锁和解锁操作简单,开销小。
  • 并发性能低:在表被锁定期间,其他事务无法对该表进行任何操作,容易造成锁冲突。

页锁特点

  • 锁的粒度介于行锁和表锁之间:以页(通常是数据页)为单位进行加锁。
  • 开销和并发性能适中:加锁和解锁开销比行锁小,比表锁大;并发性能比表锁好,比行锁差。

不同业务场景下锁粒度的选择

  • 行锁适用场景
    • 高并发读写场景:例如电商系统的商品库存更新。假设有一个商品库存表 products,包含 product_idstock 等字段。当多个用户同时购买同一款商品时,为了保证库存的准确性,需要使用行锁。如:
START TRANSACTION;
SELECT stock FROM products WHERE product_id = 1 FOR UPDATE;
-- 这里假设业务逻辑是减少库存
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
COMMIT;
  • 大量不同行的并发操作:在社交媒体的用户评论表中,每个评论对应一行数据。当大量用户同时发表评论时,使用行锁可以允许不同评论的并发处理。
  • 表锁适用场景
    • 数据一致性要求极高,并发操作较少的场景:比如在银行系统进行年终结算时,需要对整个账户表进行锁定,以确保数据的准确性和一致性。如:
LOCK TABLES accounts WRITE;
-- 进行年终结算相关的操作,例如计算总余额等
UNLOCK TABLES;
  • 批量操作数据:例如对一个表中的所有数据进行备份,使用表锁可以避免在备份过程中有其他事务对表进行修改,影响备份数据的一致性。
  • 页锁适用场景
    • 既有一定的并发读写,又有批量操作的场景:如某些日志表,既有新日志的写入(并发操作),又可能定期对一页的数据进行归档(批量操作)。页锁能够在一定程度上平衡并发性能和锁开销。