开发者学堂课程【MySQL 高级应用 - 索引和锁:间隙锁危害】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8637
间隙锁危害
目录:
一、间隙锁的定义
二、间隙锁的危害
一、间隙锁的定义
间隙:残留一条缺口。
当使用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB 会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,
nnoDB 也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key 锁)
二、间隙锁的危害
一般在云计算或大数据分析时,其数据最好是延续的。
session-2
mysq1>select* from test_innodb_lock;
+------+--------+
| a | b |
+------+--------+
| 1 | b2 |
| 3 | 3 |
| 4 | 4000 |
| 5 | 5000 |
| 6 | 6000 |
| 7 | 7000 |
| 8 | 8000 |
| 9 | 9002 |
| 1 | b1 |
+------+--------+
9 rows in set (0.00 sec )
物理方面,其中数据不存在2,使得数据不能连续。
1.例:
session-1
中进行修改如【set b='0629’ where a>1 and a<6 ;
】
现今进行 update,进行对1、3、4、5四条记录的统一修改。在 session-1无2数据之后,session-2在行锁的状态下进行操作,应当不受牵连,各自进行运行。
mysq1>select* from test_innodb_lock;
+------+--------+
| a | b |
+------+--------+
| 1 | b2 |
| 3 | 3 |
| 4 | 4000 |
| 5 | 5000 |
| 6 | 6000 |
| 7 | 7000 |
| 8 | 8000 |
| 9 | 9002 |
| 1 | b1 |
+------+--------+
9 rows in set (0.00 sec )
mysq1>update test_innodb set b='0629’
where a>1 and a<6;
//进行回车
Query OK,
1 row affected(0.00sec)
Rows matched:3 Changed:3 Warnings:0
session-2
于其中粘贴【insert into test innodb lock values(2,'2000);
】
出现了阻塞的情况
mysq1>update ;
insert into test innodb lock values(2,'2000);
此时在 session-1进行【commit】,观察 session-2,存在13秒的延迟
session-1
mysq1>commit;
//进行 commit
Query OK,
1 row affected(0.01sec)
mysq1>select* from test_innodb_lock;
+------+--------+
| a | b |
+------+--------+
| 1 | b2 |
| 3 | 3 |
| 4 | 4000 |
| 5 | 5000 |
| 6 | 6000 |
| 7 | 7000 |
| 8 | 8000 |
| 9 | 9002 |
| 1 | b1 |
| 2 | 2000 |
+------+--------+
9 rows in set (0.00 sec )
session-2
mysq1>update ;
insert into test innodb lock values(2,'2000);
Query OK,
1 row affected(13.06sec)
//明显观察到 session-2此刻拥有13.06秒的延迟运行
session-1
mysq1>select* from test_innodb_lock;
+------+--------+
| a | b |
+------+--------+
| 1 | b2 |
| 3 | 0629 |
| 4 | 0629 |
| 5 | 0629 |
| 6 | 6000 |
| 7 | 7000 |
| 8 | 8000 |
| 9 | 9002 |
| 1 | b1 |
| 2 | 2000 |
+------+--------+
10 rows in set(
0.00sec
)
此时才出现2数据的显现
2.危害
因为 Query 执行过程中通过过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值并不存在。
实现到实例中,即 mysq1在被给予的范围内,即使数据残缺,利例如并不存在数据2,也会将其锁定。
间隙锁比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。
在某些场景下这可能会对性能造成很大的危害。