MySQL 中有哪些锁类型?
按粒度分
全局锁
作用整个数据库实例,如
FLUSH TABLES WITH READ LOCK
常用于备份阻塞所有写操作,对数据库影响较大
表级锁
MyISAM默认使用表级锁,锁住整张表
InnoDB特定场景下也会使用表锁(如未命中索引时行锁升级为表锁)
类型:
表共享读锁(
LOCK TABLES ... READ
)表共享写锁(
LOCK TABLES ... WRITE
)
行级锁(Row Lock)
InnoDB默认支持行锁,锁粒度更细,提升并发性能
类型:
共享锁(Shared Lock):允许多个事务并发读取同一行,但不允许修改。只有在释放共享锁后,其他事务才能获得排它锁;
排它锁(Exclusive Lock):独占资源,阻止其他事务读写,其他事务在获得排它锁之前无法访问该资源;
意向锁(Intention Locks):用于表示某个事务对某行数据加锁的意图,分为意向共享锁(IS)和意向排它锁(IX)
InnoDB引擎特有的锁机制
记录锁(Record Lock):锁定单条索引记录
间隙锁(Gap Lock):锁住索引记录之间的间隙,防止其他事务插入新记录,用于解决幻读
临键锁(Next-Key Lock)
记录锁 + 间隙锁的组合,锁定范围为左开右闭区间(如(2,5])
在可重复读(RR)隔离级别下默认启用
自增锁(Auto Increment Lock):在插入自增列时,加锁以保证自增值的唯一性,防止并发插入导致的冲突;通常在插入操作时被使用,以确保生成的自增ID是唯一的
按使用场景分
乐观锁:假设冲突少,通过版本号(如version字段)实现,不阻塞读操作
悲观锁:假设冲突多,直接加锁(如SELECT ... FOR UPDATE)
死锁
InnoDB 自动检测死锁并回滚其中一个事务
MyISAM 不支持死锁检测,需等待锁超时
总结:
InnoDB 适合高并发、事务密集的场景(如电商、金融系统)
MyISAM 适合读多写少、无需事务的场景(如日志系统)
评论