mysql 中Record Lock(记录锁)Gap Lock(间隙锁)
1. Record Lock(记录锁)
- 定义:锁定单个行记录(仅锁定索引对应的行,不包含范围)。
- 适用场景:通过唯一索引(主键 / 唯一键)精准命中某一行时。
表 score_tbl
主键为 (student_id, course_id)
,事务 A 更新精准命中的行:
— 事务A
BEGIN;
UPDATE score_tbl SET score=95 WHERE student_id=1 AND course_id=1; — 加Record Lock(行级X锁)
2. Gap Lock(间隙锁)
定义:锁定索引范围内的间隙(不包含记录本身),防止其他事务在间隙中插入数据(解决幻读)。
适用场景:REPEATABLE READ 及以上级别,通过非唯一索引或范围查询时触发。
范围示例:若索引存在值 4、7,则间隙锁可能锁定 (4,7) 区间。
表 students 有索引 age,值为 22、24、25。事务 A 锁定 age=24 的间隙:
— 事务A(REPEATABLE READ级别)
BEGIN;
— 查询age=24,未命中(假设无此记录),加Gap Lock锁定(22,25)间隙
SELECT * FROM students WHERE age=24 FOR UPDATE;
— 事务B尝试在间隙中插入数据会被阻塞
BEGIN;
INSERT INTO students (age) VALUES (23); — 阻塞,因(22,25)被Gap Lock锁定
3. Next-Key Lock(记录锁 + 间隙锁)
定义:锁定索引范围 + 记录本身(左开右闭区间),是 InnoDB 默认的行锁算法。
适用场景:非唯一索引的精准查询或范围查询(REPEATABLE READ 级别)。
表 students 索引 age 有值 22、24、25。事务 A 查询 age=24(命中):
— 事务A
BEGIN;
SELECT * FROM students WHERE age=24 FOR UPDATE;
— 加Next-Key Lock,锁定(22,24]区间(包含24本身的Record Lock + (22,24)的Gap Lock)
— 事务B插入age=23(在(22,24)间隙)会被阻塞;更新age=24也会被阻塞
4. Insert Intention Lock(插入意向锁)
定义:INSERT 操作时产生的特殊间隙锁,标识 “事务想在某间隙插入数据”,多个事务插入不冲突的行时不互斥。
适用场景:多事务同时向同一间隙插入不同数据时。
索引 age 有值 4、7,事务 A 插入 5,事务 B 插入 6:
— 事务A
BEGIN;
INSERT INTO students (age) VALUES (5); — 加Insert Intention Lock锁定(4,7)间隙
— 事务B
BEGIN;
INSERT INTO students (age) VALUES (6); — 同样加Insert Intention Lock,与A兼容,不阻塞
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » mysql 中Record Lock(记录锁)Gap Lock(间隙锁)