Mysql锁机制与优化实践以及MVCC底层原理剖析
MySQL锁机制与MVCC原理深度剖析
一、锁机制基础概念
锁是协调多进程/线程并发访问资源的机制,用于解决数据库并发访问中的数据一致性问题。
二、锁分类体系
1. 按性能分类
- 乐观锁:版本号/CAS机制,适合读多写少场景
- 悲观锁:默认并发会产生冲突,适合写多场景
2. 按操作粒度分类
锁类型 | 开销 | 死锁 | 并发度 | 适用场景 |
---|---|---|---|---|
表锁 | 小 | 无 | 最低 | 整表迁移 |
页锁 | 中 | 有 | 一般 | BDB引擎 |
行锁 | 大 | 有 | 最高 | 高并发OLTP |
3. 按操作类型分类
- 共享锁(S锁):
SELECT ... LOCK IN SHARE MODE
- 排他锁(X锁):
SELECT ... FOR UPDATE
- 意向锁:表级锁优化机制
- IS锁:加表共享锁前获取
- IX锁:加表排他锁前获取
三、InnoDB特殊锁机制
1. 间隙锁(Gap Lock)
- 作用范围:锁定索引记录间的间隙
- 解决幻读:防止在RR级别下其他事务在间隙插入数据
- 示例:
SELECT * FROM account WHERE id=18 FOR UPDATE
会锁定(10,20)区间
2. 临键锁(Next-key Lock)
行锁 + 间隙锁的组合形式
四、锁优化实践
- 确保查询走索引,避免行锁升级表锁
- 合理设计索引缩小锁定范围
- 减少检索条件范围,避免间隙锁
- 控制事务大小,加锁操作尽量靠后
- 使用合适的事务隔离级别
五、MVCC多版本并发控制
1. 核心机制
- 通过undo日志版本链实现
- 关键字段:
trx_id
:事务IDroll_pointer
:回滚指针
2. ReadView可见性规则
情况 | trx_id范围 | 可见性 |
---|---|---|
已提交 | < min_id | 可见 |
将来事务 | > max_id | 不可见 |
未提交事务 | 在视图数组中 | 不可见 |
已提交事务 | 不在视图数组中 | 可见 |
3. 隔离级别实现差异
- RR级别:使用事务首次查询时的ReadView
- RC级别:每次查询重新生成ReadView
六、锁问题排查
-- 查看事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;-- 查看锁等待(MySQL 8.0+)
SELECT * FROM performance_schema.data_lock_waits;-- 分析死锁
SHOW ENGINE INNODB STATUS;
七、存储引擎对比
特性 | InnoDB | MyISAM |
---|---|---|
事务支持 | 支持 | 不支持 |
锁粒度 | 行锁 | 表锁 |
并发性能 | 高 | 低 |
自动加锁 | 仅写操作加行锁 | 查询自动加读锁 |
提示:实际开发中应优先考虑InnoDB引擎,除非有特殊需求
该笔记已适配CSDN的Markdown编辑器,包含:
- 多级标题结构
- 表格对比
- 代码块
- 重点内容标记
- 清晰的分类展示
可直接复制到CSDN的Markdown编辑器中使用