间隙锁危害|学习笔记

简介: 快速学习间隙锁危害

开发者学堂课程【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,进行对1345四条记录的统一修改。在 session-12数据之后,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,也会将其锁定。

间隙锁比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。

在某些场景下这可能会对性能造成很大的危害。

相关文章
|
3天前
|
存储 关系型数据库 MySQL
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
53 0
|
3天前
|
关系型数据库 MySQL 数据库
|
7月前
|
安全 算法 Java
可重入锁,不可重入锁,死锁的多种情况,以及产生的原因,如何解决,synchronized采用的锁策略(渣女圣经)自适应的底层,锁清除,锁粗化,CAS的部分应用
可重入锁,不可重入锁,死锁的多种情况,以及产生的原因,如何解决,synchronized采用的锁策略(渣女圣经)自适应的底层,锁清除,锁粗化,CAS的部分应用
|
10月前
什么是死锁?产生死锁的原因?产生死锁的四个必要条件?死锁的避免与预防?
什么是死锁?产生死锁的原因?产生死锁的四个必要条件?死锁的避免与预防?
161 0
|
3天前
|
SQL 存储 关系型数据库
MySQL 意向共享锁、意向排他锁、死锁
MySQL 意向共享锁、意向排他锁、死锁
55 0
MySQL 意向共享锁、意向排他锁、死锁
|
6月前
|
Linux API C++
锁、避免死锁等相关
锁、避免死锁等相关
35 0
|
10月前
|
存储 SQL Oracle
解析 MySQL 锁机制:共享锁、排它锁、间隙锁、意向锁等,保障数据安全与高并发的秘密武器
解析 MySQL 锁机制:共享锁、排它锁、间隙锁、意向锁等,保障数据安全与高并发的秘密武器
167 1
|
10月前
|
存储 Java C++
【全网最细系列】synchronized锁详解,偏向锁与锁膨胀全流程
【全网最细系列】synchronized锁详解,偏向锁与锁膨胀全流程
181 0
|
11月前
|
SQL Java 数据库连接
数据库相关锁总结(共享锁,排它锁,更新锁,意向锁,计划锁),看完这篇将会对锁产生更深的理解
数据库相关锁总结(共享锁,排它锁,更新锁,意向锁,计划锁),看完这篇将会对锁产生更深的理解
|
12月前
|
SQL 监控 Oracle
【悲观锁/乐观锁/排它锁/共享锁/表级锁/行级锁/死锁】
【悲观锁/乐观锁/排它锁/共享锁/表级锁/行级锁/死锁】