间隙锁危害|学习笔记

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

开发者学堂课程【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月前
|
SQL JavaScript 关系型数据库
Mysql索引不当引发死锁问题
本文通过真实案例解析了MySQL在高并发环境下出现死锁的问题。数据库表`t_award`包含多个索引,但在执行特定SQL语句时遭遇索引失效,导致更新操作变慢并引发死锁。分析发现,联合索引`(pool_id, identifier, status, is_redeemed)`因`identifier`允许为空值而导致索引部分失效。此外,`pool_id`上的普通索引产生的间隙锁在高并发下加剧了死锁风险。为解决此问题,文中提出了调整索引顺序至`(pool_id, status, is_redeemed, identifier)`等方案来优化索引使用,进而减轻死锁现象。
|
3月前
|
SQL 关系型数据库 MySQL
临键锁引发的死锁
【8月更文挑战第4天】
40 0
临键锁引发的死锁
|
3月前
|
数据库 SQL
间隙锁+临键锁
【8月更文挑战第1天】
45 0
|
6月前
|
存储 关系型数据库 MySQL
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
276 0
|
6月前
|
Java 编译器
多线程(锁升级, 锁消除, 锁粗化)
多线程(锁升级, 锁消除, 锁粗化)
57 1
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
88 0
|
6月前
|
关系型数据库 MySQL 数据库
什么是死锁?产生死锁的原因?产生死锁的四个必要条件?死锁的避免与预防?
什么是死锁?产生死锁的原因?产生死锁的四个必要条件?死锁的避免与预防?
266 0
|
6月前
|
Java 编译器 程序员
synchronized 原理(锁升级、锁消除和锁粗化)
synchronized 原理(锁升级、锁消除和锁粗化)
|
存储 SQL Oracle
解析 MySQL 锁机制:共享锁、排它锁、间隙锁、意向锁等,保障数据安全与高并发的秘密武器
解析 MySQL 锁机制:共享锁、排它锁、间隙锁、意向锁等,保障数据安全与高并发的秘密武器
434 1