MySQL中的锁机制是确保数据库并发操作正确性和一致性的重要组成部分,根据锁的粒度、用途和特性,可以分为多种类型。以下是MySQL中常见的锁及其详细说明:
一、按锁的粒度划分
-
行级锁(Row-level Locks)
- 描述:锁定表中的单行记录,允许多个事务同时访问表的不同行,提供高并发性。
- 支持引擎:InnoDB(默认支持)。
- 类型 :
- 记录锁(Record Lock):直接锁定某一行,防止其他事务修改或删除。
- 间隙锁(Gap Lock):锁定索引记录之间的间隙,防止新记录插入(用于防止幻读)。
- 临键锁(Next-Key Lock):结合记录锁和间隙锁,锁定一个范围及其行(默认行锁实现方式)。
-
表级锁(Table-level Locks)
- 描述:锁定整个表,事务访问表时需先获取锁,并发性较低。
- 支持引擎:MyISAM、InnoDB(通过意向锁间接实现)。
- 类型 :
- 表共享读锁(S Lock):允许其他事务读表,但禁止写。
- 表独占写锁(X Lock):禁止其他事务读写。
-
页级锁(Page-level Locks)
- 描述:锁定数据页(一组连续的行),介于行锁和表锁之间。
- 支持引擎:BDB(已弃用),InnoDB不直接使用。
二、按锁的性质划分
-
共享锁(Shared Lock, S Lock)
- 行为:允许其他事务读同一数据,但禁止写。
- 使用场景 :
SELECT ... LOCK IN SHARE MODE
。
-
排他锁(Exclusive Lock, X Lock)
- 行为:禁止其他事务读写数据。
- 使用场景 :
SELECT ... FOR UPDATE
,数据修改(INSERT/UPDATE/DELETE)。
-
意向锁(Intention Locks)
- 作用:协调不同粒度锁(如表锁与行锁)的冲突检测。
- 类型 :
- 意向共享锁(IS):事务打算在表的某些行上加共享锁。
- 意向排他锁(IX):事务打算在表的某些行上加排他锁。
三、特殊用途锁
-
自增锁(Auto-inc Lock)
- 作用:确保自增主键(AUTO_INCREMENT)的连续性和唯一性。
- 特点:在插入操作时短暂持有,事务提交后释放。
-
元数据锁(Metadata Lock, MDL)
- 作用:保护表结构(如ALTER TABLE)不被并发修改。
- 行为:自动加锁,事务结束时释放。
-
全局锁(Global Lock)
- 作用:锁定整个数据库实例,禁止所有写操作。
- 使用场景 :全库备份(
FLUSH TABLES WITH READ LOCK
)。
四、锁的兼容性
请求锁 \ 现有锁 | X | IX | S | IS |
---|---|---|---|---|
X(排他锁) | 冲突 | 冲突 | 冲突 | 冲突 |
IX(意向排他锁) | 冲突 | 兼容 | 冲突 | 兼容 |
S(共享锁) | 冲突 | 冲突 | 兼容 | 兼容 |
IS(意向共享锁) | 冲突 | 兼容 | 兼容 | 兼容 |
五、锁与隔离级别
- 读未提交(Read Uncommitted):不加锁,通过脏读实现。
- 读已提交(Read Committed):使用记录锁,无间隙锁。
- 可重复读(Repeatable Read):默认使用临键锁(Next-Key Lock),防止幻读。
- 串行化(Serializable):所有读操作加共享锁,写操作加排他锁。
六、死锁处理
- 检测机制:InnoDB通过等待图(Wait-for Graph)检测死锁。
- 处理策略:强制回滚代价较小的事务,释放其锁资源。
七、监控与分析工具
SHOW ENGINE INNODB STATUS
:查看InnoDB引擎状态,包括锁信息。INFORMATION_SCHEMA
:INNODB_TRX
:当前运行的事务。INNODB_LOCKS
:当前持有的锁。INNODB_LOCK_WAITS
:锁等待关系。
- 性能模式(Performance Schema):监控锁的获取和释放。
你想要的我全都有:https://pan.q删掉憨子uark.cn/s/75a5a07b45a2
