MySQL锁的分类及具体作用

发布时间:2026/6/26 21:03:31

MySQL锁的分类及具体作用 在数据库系统中锁是保证数据一致性和并发控制的核心机制。MySQL作为流行的关系型数据库提供了丰富多样的锁策略来应对不同的并发场景。理解MySQL锁的分类及其作用对于优化数据库性能、避免死锁以及保证数据正确性至关重要。本文将从锁的粒度、锁的功能两个维度系统梳理MySQL中的各类锁并详细说明每种锁的用途、加锁方式及注意事项。一、按锁的粒度分类锁的粒度指的是锁定的范围大小粒度越细并发能力越强但加锁开销也越大。MySQL中按粒度可分为全局锁、表级锁和行级锁。1. 全局锁全局锁是对整个数据库实例加锁加锁后整个数据库处于只读状态。通常用于全库逻辑备份确保备份数据的一致性。加锁语句FLUSH TABLES WITH READ LOCK;作用阻塞所有数据更新操作INSERT、UPDATE、DELETE和表结构变更ALTER、DROP等仅允许读取。缺点导致业务停滞无法处理写请求。优化方案对于使用InnoDB存储引擎的表可利用事务的可重复读隔离级别在备份时开启一个事务利用MVCC多版本并发控制创建一致性快照避免加全局锁。使用mysqldump工具时添加--single-transaction参数该选项会在备份前启动一个事务基于快照进行备份从而避免全局锁。2. 表级锁表级锁锁定整张表实现简单开销较小但并发度较低。MyISAM和InnoDB都支持表级锁。2.1 表锁通过LOCK TABLES语句显式加锁可以加共享锁读锁或排他锁写锁。表级共享锁LOCK TABLES user READ;阻止其他会话对表进行写操作当前会话只能读该表不能访问其他表。表级排他锁LOCK TABLES user WRITE;阻止其他会话对该表进行任何读/写操作当前会话可读写该表但不能访问其他表。2.2 元数据锁MDL锁MDL锁是MySQL自动管理的表级锁用于保护表结构定义。当对一个表执行SELECT加MDL读锁时会阻止其他会话对该表执行DDL操作如ALTER TABLE直到当前事务提交。释放时机事务提交后自动释放。作用防止在查询过程中表结构被修改保证元数据的一致性。2.3 意向锁意向锁是InnoDB自动维护的表级锁用于快速判断表级锁与行级锁的兼容性避免逐行检查。用户无法手动干预。意向共享锁IS锁事务准备给表中的某些行加共享锁S锁时先在表上加IS锁。意向排他锁IX锁事务准备给表中的某些行加排他锁X锁时先在表上加IX锁。意向锁的兼容规则意向锁之间相互兼容IS与IS、IS与IX、IX与IX均不冲突。意向锁与行级S锁/X锁也兼容因为它们是在不同粒度上的锁。但意向排他锁IX与表级共享锁S或表级排他锁X互斥意向共享锁IS与表级共享锁S兼容与表级排他锁X互斥。表级锁 \ 意向锁IS锁IX锁S锁共享表锁兼容互斥X锁独占表锁互斥互斥2.4 自增锁AUTO-INC锁自增锁是一种特殊的表级锁用于保证自增列AUTO_INCREMENT值的唯一性和连续性。事务向包含自增列的表插入数据时需要获取自增锁。传统模式语句执行期间持有自增锁直到语句结束才释放影响并发插入性能。优化模式MySQL 5.1.22起提供innodb_autoinc_lock_mode参数控制自增锁行为0传统模式采用AUTO-INC锁语句执行完释放。1连续模式MySQL 8.0前默认普通INSERT申请到自增值后立即释放锁批量插入如INSERT ... SELECT需等待语句结束释放。2交错模式MySQL 8.0后默认使用轻量级互斥锁多条插入语句可并发执行性能最高。但需将binlog格式设置为ROW以保证主从数据一致性。3. 行级锁行级锁仅锁定具体的数据行并发度高是InnoDB的核心特性。MyISAM不支持行级锁。3.1 记录锁Record Lock锁定单个行记录是最基本的行锁。加锁方式-- 加共享记录锁S锁 SELECT ... LOCK IN SHARE MODE; -- 或 SELECT ... FOR SHARE; -- MySQL 8.0 -- 加排他记录锁X锁 SELECT ... FOR UPDATE;特性对某行加S锁后其他事务可加S锁但不能加X锁。对某行加X锁后其他事务不能加任何锁S或X。锁在事务提交或回滚后释放。例如对id2的记录加X锁BEGIN; SELECT * FROM user WHERE id 2 FOR UPDATE; -- 其他事务无法修改id2的记录 COMMIT;3.2 间隙锁Gap Lock间隙锁锁定一个范围开区间但不包括记录本身目的是防止其他事务在该范围内插入新记录从而避免幻读。示例表中已有id1,2,3,5的记录间隙锁锁定(1,5)范围即禁止在id2,3的位置插入新记录但不影响id5的记录。作用范围仅在可重复读REPEATABLE READ隔离级别下生效。兼容性不同事务可在同一间隙上加间隙锁因为间隙锁只阻塞插入不阻塞查询。3.3 临键锁Next-Key Lock临键锁是记录锁与间隙锁的组合锁定一个范围并包含记录本身。它是InnoDB在可重复读级别下解决幻读的主要手段。示例锁定(1,5]范围即锁住id2,3,5的记录同时防止在(1,5)范围内插入新记录。特性不同事务对相同范围的X型临键锁是互斥的。3.4 插入意向锁插入意向锁是一种特殊的间隙锁表示事务准备在某个间隙中插入新记录。它由InnoDB自动管理用户无法干预。作用协调多个事务在同一个间隙内的插入操作提高并发度。兼容规则如果事务A持有某个间隙的间隙锁事务B想要在同一间隙加插入意向锁则B必须等待A释放间隙锁。如果多个事务准备在同一个间隙的不同位置插入记录它们的插入意向锁可以共存互不阻塞。插入意向锁与间隙锁互斥但与记录锁不直接冲突记录锁锁住的是记录本身。二、按锁的功能分类无论是表级锁还是行级锁从功能上都可以分为共享锁S锁和排他锁X锁。共享锁S锁读锁事务读取数据时获取。允许其他事务同时加S锁但不允许加X锁。排他锁X锁写锁事务修改数据时获取。不允许其他事务再加任何锁S或X。兼容性矩阵锁类型S锁X锁S锁兼容互斥X锁互斥互斥加锁语句示例-- 加共享锁 SELECT ... LOCK IN SHARE MODE; -- MySQL 5.x SELECT ... FOR SHARE; -- MySQL 8.x -- 加排他锁 SELECT ... FOR UPDATE;三、扩展快照读与当前读理解锁机制离不开对MySQL读取模式的认识。InnoDB支持两种读取方式1. 快照读利用MVCC机制读取的是记录的历史版本快照不加锁因此不会阻塞其他事务。仅在读已提交RC和可重复读RR隔离级别下生效。RC级别下每次执行SELECT都会获取最新的快照RR级别下仅在事务开始时获取一次快照后续读取同一快照。2. 当前读读取记录的最新版本并对读取的记录加锁S锁或X锁确保其他事务不能修改这些记录。常见当前读操作SELECT ... FOR UPDATE; -- 加X锁 SELECT ... LOCK IN SHARE MODE; -- 加S锁 INSERT; UPDATE; DELETE;四、总结MySQL的锁机制复杂而精细理解不同锁的作用和适用场景有助于我们编写高效、可靠的并发事务。下表简要总结了主要锁类型及其用途锁类型粒度主要作用全局锁数据库全库备份保证一致性表锁表显式锁定整张表用于特定操作元数据锁表保护表结构防止DDL与DML冲突意向锁表快速判断表锁与行锁的兼容性自增锁表保证自增列的唯一性记录锁行锁定单行记录间隙锁间隙防止幻读禁止在范围内插入临键锁行间隙记录锁与间隙锁的组合解决幻读插入意向锁间隙协调并发插入提高插入性能在实际开发中合理选择隔离级别、优化SQL语句、避免长事务都能减少锁冲突提升系统并发能力。

相关新闻