MySQL 的锁机制

75 阅读2分钟

MySQL 的锁机制是数据库管理系统中非常重要的一部分,它涉及到事务隔离性、并发性等方面:

  1. MySQL锁的分类:

    • 按层次划分:

      • 全局锁(Global Lock): 作用于整个数据库实例,通常用于对整个数据库进行备份或主从同步时需要暂停写入操作。
      • 表级锁(Table Lock): 作用于数据表,对表进行读写操作时加锁。包括读锁(共享锁)和写锁(排它锁)。
      • 行级锁(Row Lock): 作用于表的行,对表中的某一行进行读写操作时加锁。可以更细粒度地控制事务并发。
    • 按锁的颗粒度划分:

      • 粗粒度锁: 如表锁,对整张表加锁。
      • 细粒度锁: 如行锁,对表中的一行或某个数据项加锁。
  2. MDL锁(Metadata Lock):

    • MDL 锁是 MySQL 的元数据锁,用于保护元数据操作,如对表结构的修改。
    • MDL 锁不是 InnoDB 存储引擎的实现,而是在 MySQL 服务器层实现的。
    • MDL 锁的作用是为了解决事务隔离和数据复制问题。
  3. InnoDB存储引擎的表级锁:

    • IS锁(Intention Shared Lock): 意向共享锁,表示事务准备在表上加共享锁,即将对表中的某些行加行级共享锁。
    • IX锁(Intention Exclusive Lock): 意向排它锁,表示事务准备在表上加排它锁,即将对表中的某些行加行级排它锁。
    • S锁(Shared Lock): 共享锁,用于读操作,多个事务可以同时持有共享锁,互不影响。
    • X锁(Exclusive Lock): 排它锁,用于写操作,事务独占资源,其他事务不能同时持有任何类型的锁。
  4. InnoDB存储引擎的行级锁:

    • Record Lock: 记录锁,锁定某行数据。
    • Gap Lock: 间隙锁,锁定一个范围,但不包括记录本身。
    • Next-Key Lock: 间隙锁和记录锁的结合,用于解决幻读问题。
    • Insert Intention Lock: 插入意向锁,表示事务打算在一个范围内插入一个新记录。
  5. 行锁和表锁的选择:

    • 行锁更适合高并发环境,可以提高并发性能,但会增加系统开销。
    • 表锁适用于特定的场景,如全表扫描,适合于少量大事务操作。