MySQL中的锁机制复杂多样,主要可根据锁粒度、互斥性、加锁方式及思想维度等多个维度进行分类。以下是主要锁类型的详细概述:
一、按锁粒度分类
1、全局锁
定义:对整个数据库实例加锁,使数据库处于只读状态。
用途:用于全库逻辑备份,确保备份期间数据一致性。
命令:FLUSH TABLES WITH READ LOCK施加锁,UNLOCK TABLES释放锁。
2、表级锁
表锁:锁定整张表,分为读锁(允许读但禁止写)和写锁(仅当前线程可读写),MyISAM存储引擎默认使用此锁。
元数据锁(MDL):保护表结构,自动加锁机制防止DDL与DML操作冲突。
意向锁:包括意向共享锁(IS)和意向排他锁(IX),用于协调行锁与表锁的共存,表明事务将对表中某行加锁。
3、页级锁
定义:锁定数据页,开销和加锁时间介于表锁和行锁之间,现实业务中使用较少。
4、行级锁
记录锁:直接锁定索引记录本身,防止其他事务对该行进行更新或删除操作。
间隙锁:锁定索引记录之间的间隙,防止其他事务在间隙中插入新记录,避免幻读。
临键锁:结合记录锁和间隙锁的特性,同时锁住数据及其前后间隙,在RR隔离级别下默认启用。
二、按互斥性分类
1、共享锁(S锁)
定义:允许事务读取资源,但阻止其他事务获取排他锁。
语法:通过SELECT ... LOCK IN SHARE MODE或SELECT ... FOR SHARE显式添加。
2、排他锁(X锁)
定义:允许事务更新或删除资源,并阻止其他事务获取任何类型的锁。
语法:通过SELECT ... FOR UPDATE显式添加。
三、按加锁方式分类
1、显示锁
定义:通过手动编写SQL语句指定的锁。
示例:SELECT ... FOR UPDATE或LOCK TABLES ... READ/WRITE。
2、隐式锁
定义:由系统根据事务隔离级别自动施加的锁。
特点:无需用户显式指定,由数据库管理系统自动管理。
四、按思想维度分类
1、乐观锁
定义:假设并发冲突概率较低,仅在提交时检查数据是否被修改,适用于读多写少的场景。
实现:通常通过版本号或时间戳判断数据变更。
2、悲观锁
定义:假设并发冲突频繁,提前加锁避免竞争,适用于写多读少的场景。
实现:通过SELECT ... FOR UPDATE等语句显式加锁。
五、其他重要锁类型
1、插入意向锁
定义:INSERT操作前设置的特殊间隙锁,允许多个事务在同一间隙插入不同位置的数据。
作用:提升插入操作的并发性能。
2、自增锁(AUTO-INC Lock)
定义:针对自增列的特殊锁,确保自增值的唯一性和顺序性。
3、空间谓词锁
定义:用于空间索引的特殊锁,优化地理空间数据的查询效率。
综上所述,MySQL提供了多种锁类型以满足不同场景的需求,每种锁都有其特定的用途和特点。在选择使用哪种锁时,应根据具体的应用场景和需求来决定。