数据库

MySQL中有哪些锁类型?

2025-08-28 13:30:00 | 来源:企业IT培训

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提供了多种锁类型以满足不同场景的需求,每种锁都有其特定的用途和特点。在选择使用哪种锁时,应根据具体的应用场景和需求来决定。

标签: MySQL MySQL锁类型