在MySQL中,常见的锁

36 阅读2分钟

在MySQL中,常见的锁可以分为两大类:表级锁和行级锁。除此之外,还有一些其他的锁类型,具体如下:

  1. 表级锁(Table-level locks):

    • 表锁(Table Locks): 锁定整个表,是最粗粒度的锁。包括读锁和写锁。读锁允许多个事务同时获取读锁,但不允许写锁和其他写锁并存。写锁则要求独占,不允许其他事务获取读锁和写锁。
    • 全局锁(Global Locks): 对整个数据库实例加锁,限制整个数据库的读写操作。通常用于执行全库备份等场景。
  2. 行级锁(Row-level locks):

    • 共享锁(Shared Locks): 多个事务可以同时持有相同行的共享锁,用于读取操作,不阻塞其他事务的共享锁。
    • 排它锁(Exclusive Locks): 只允许一个事务持有排它锁,用于写入操作,其他事务不能同时持有共享锁或排它锁。
  3. 页级锁(Page-level locks):

    • 将表按页(通常是数据页大小,如InnoDB中的16KB)进行划分,锁定整个数据页。开销和加锁时间介于表锁和行锁之间。
  4. 意向锁(Intention Locks):

    • 表示一个事务准备在某一层级上加哪种类型的锁,包括意向共享锁和意向排它锁。用于辅助数据库管理系统判断事务之间的锁关系,从而避免死锁。
  5. 自增锁(Auto-increment Locks):

    • 当多个事务同时插入数据到自增列的表时,会使用自增锁,保证生成的自增值是唯一的。
  6. 间隙锁(Gap Locks):

    • 用于锁定一个范围而不是具体的行,防止其他事务在这个范围插入新行,用于防止幻读的发生。

这些锁在MySQL中的实现依赖于存储引擎的不同,例如InnoDB和MyISAM在处理锁的方式上有很大的差异。 InnoDB通常使用行级锁,而MyISAM更倾向于使用表级锁。