MySQL 中有哪些锁类型?

March 18, 2025 / 老大 / 4阅读 / 0评论/ 分类: 数据库

按粒度分

  1. 全局锁

  • 作用整个数据库实例,如FLUSH TABLES WITH READ LOCK常用于备份

  • 阻塞所有写操作,对数据库影响较大

  1. 表级锁

  • MyISAM默认使用表级锁,锁住整张表

  • InnoDB特定场景下也会使用表锁(如未命中索引时行锁升级为表锁)

    • 类型:

      • 表共享读锁(LOCK TABLES ... READ

      • 表共享写锁(LOCK TABLES ... WRITE

  1. 行级锁(Row Lock)

  • InnoDB默认支持行锁,锁粒度更细,提升并发性能

  • 类型:

    • 共享锁(Shared Lock):允许多个事务并发读取同一行,但不允许修改。只有在释放共享锁后,其他事务才能获得排它锁;

    • 排它锁(Exclusive Lock):独占资源,阻止其他事务读写,其他事务在获得排它锁之前无法访问该资源;

    • 意向锁(Intention Locks):用于表示某个事务对某行数据加锁的意图,分为意向共享锁(IS)和意向排它锁(IX)

InnoDB引擎特有的锁机制

  1. 记录锁(Record Lock):锁定单条索引记录

  2. 间隙锁(Gap Lock):锁住索引记录之间的间隙,防止其他事务插入新记录,用于解决幻读

  3. 临键锁(Next-Key Lock)

  • 记录锁 + 间隙锁的组合,锁定范围为左开右闭区间(如(2,5])

  • 在可重复读(RR)隔离级别下默认启用

  • 自增锁(Auto Increment Lock):在插入自增列时,加锁以保证自增值的唯一性,防止并发插入导致的冲突;通常在插入操作时被使用,以确保生成的自增ID是唯一的

按使用场景分

  1. 乐观锁:假设冲突少,通过版本号(如version字段)实现,不阻塞读操作

  2. 悲观锁:假设冲突多,直接加锁(如SELECT ... FOR UPDATE)

死锁

  • InnoDB 自动检测死锁并回滚其中一个事务

  • MyISAM 不支持死锁检测,需等待锁超时

总结

  • InnoDB 适合高并发、事务密集的场景(如电商、金融系统)

  • MyISAM 适合读多写少、无需事务的场景(如日志系统)

#MySQL(21)

评论