MySQL RR/RC隔离级别下SELECT FOR UPDATE锁行为深度解析:从原理到秒杀实战
1. 事务隔离级别与锁机制基础
在数据库系统中,事务隔离级别和锁机制是确保数据一致性的核心要素。MySQL的InnoDB引擎支持四种标准隔离级别,其中**Read Committed(RC) 和 Repeatable Read(RR)**是最常用的两种。
RC与RR的核心差异 :
- RC隔离级别下,每次读取都会获取最新的已提交数据
- RR隔离级别通过快照读实现可重复读,并通过间隙锁(Gap Lock)防止幻读
- RR在索引查询时会添加Next-Key Lock(记录锁+间隙锁)
关键提示:在MySQL 8.0中,RR隔离级别通过更完善的锁机制已经可以完全避免幻读,而不仅仅是"一定程度上"防止幻读。
锁类型矩阵 :
| 锁类型 | 共享锁(S) | 排他锁(X) | 意向共享锁(IS) | 意向排他锁(IX) |
|---|---|---|---|---|
| 共享锁 | 兼容 | 冲突 | 兼容 | 冲突 |
| 排他锁 | 冲突 | 冲突 | 冲突 | 冲突 |
2. SELECT FOR UPDATE的锁行为分析
SELECT FOR UPDATE 语句会在查询时对符合条件的记录加上排他锁(X锁),其具体行为随隔离级别和索引类型变化:
2.1 主键索引场景
-- 测试表结构
CREATE TABLE `inventory` (
`id` bigint NOT NULL AUTO_INCREMENT,
`product_code` varchar(32) NOT NULL,
`stock` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product` (`product_code`),
KEY `idx_stock` (`stock`)
) ENGINE=InnoDB;
RC隔离级别 :
- 精确匹配(如
id=1)只锁定匹配的记录 - 范围查询(如
id>1)锁定所有扫描到的记录
RR隔离级别 :



被折叠的 条评论
为什么被折叠?



