mysql 间隙锁专题
本文研究记录mysql间隙锁,涉及以下情况
唯一索引
非唯一索引
范围更新
等值更新
mysql8
mysql7
RR
RC
数据准备
mysql> select * from vodb.test1 limit 5;
+----+------+------+--------+------------------------+---------------------+
| id | uid | tid | tname | tvalue | createtime |
+----+------+------+--------+------------------------+---------------------+
| 1 | 1 | 0 | aaabbb | 有张有驰有分寸0 | 2021-04-20 14:06:44 |
| 2 | 2 | 1 | aaabbb | 有张有驰有分寸1 | 2021-04-20 14:06:44 |
| 8 | 8 | 1 | aaabbb | 有张有驰有分寸1 | 2021-04-20 14:14:25 |
| 9 | 9 | 2 | aaabbb | 有张有驰有分寸2 | 2021-04-20 14:14:25 |
| 10 | 10 | 3 | aaabbb | 有张有驰有分寸3 | 2021-04-20 14:14:25 |
+----+------+------+--------+------------------------+---------------------+
5 rows in set (0.00 sec)
表结构
mysql> desc vodb.test1;
+------------+-------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------------+-------------------+
| id | int | NO | PRI | NULL | auto_increment |
| uid | int | YES | UNI | NULL | |
| tid | int | YES | MUL | NULL | |
| tname | varchar(12) | YES | | NULL | |
| tvalue | varchar(90) | YES | | NULL | |
| createtime | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+-------------+------+-----+-------------------+-------------------+
6 rows in set (0.00 sec)
mysql7、非唯一索引、范围更新、RR
mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> select * from test1 where tid between 1 and 7 for update;
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(4,4,1,'a','b');
结论:会锁定间隙,不允许其他事务插入
mysql7、非唯一索引、等值更新、RR
mysql> select * from test1 where tid =1 for update;
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(3,3,2,'a','b'); ^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
mysql>
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(5,5,2,'a','b'); ^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
结论:会锁定间隙,不允许其他事务插入
mysql7、唯一索引、范围更新、RR
mysql> select * from test1 where uid between 2 and 8 for update;
+----+------+------+--------+------------------------+---------------------+
| id | uid | tid | tname | tvalue | createtime |
+----+------+------+--------+------------------------+---------------------+
| 2 | 2 | 1 | aaabbb | 有张有驰有分寸1 | 2021-04-20 14:17:20 |
| 8 | 8 | 7 | aaabbb | 有张有驰有分寸7 | 2021-04-20 14:17:20 |
+----+------+------+--------+------------------------+---------------------+
2 rows in set (0.00 sec)
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(3,3,2,'a','b'); ^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
结论:会锁定间隙,不允许其他事务插入
mysql7、唯一索引、等值更新、RR :会锁定间隙,不允许其他事务插入
其他场景,mysql8 等,记录略,结果如下
---------------------------------------------------------------------------------------------------------------
RR 级别:不管是唯一索引还是非唯一索引,更新数据锁类型:行锁+间隙锁
RC 级别:不管是唯一索引还是非唯一索引,更新数据锁类型:行锁,无间隙锁
---------------------------------------------------------------------------------------------------------------
mysql 间隙锁专题的更多相关文章
- MySQL 间隙锁
一.根据案例二:不同索引加锁顺序的问题,模拟重现死锁(详细操作步骤) 1.RR级别下,更新操作默认会加行级锁,行级锁会对索引加锁 2.如果更新语句使用多个索引,行级锁会先锁定普通索引,再锁定聚簇索引 ...
- Mysql 间隙锁原理,以及Repeatable Read隔离级别下可以防止幻读原理(百度)
Mysql知识实在太丰富了,前几天百度的面试官问我MySql在Repeatable Read下面是否会有幻读出现,我说按照事务的特性当然会有, 但是面试官却说 Mysql 在Repeatable Re ...
- 关于mysql 间隙锁
前段时间系统老是出现update死锁,很是纠结.经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围.间隙锁的主要作用是为了防止出现 ...
- MySQL间隙锁问题
间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间. 最近用户反馈说系统老是出现insert时,等待超时了,最后发现是ins ...
- mysql间隙锁
什么是间隙锁(gap lock)? 间隙锁是一个在索引记录之间的间隙上的锁. 间隙锁的作用? 保证某个间隙内的数据在锁定情况下不会发生任何变化.比如我mysql默认隔离级别下的可重复读(RR). 当使 ...
- mysql间隙锁 转
前面一文 mysql锁 介绍了mysql innodb存储引擎的各种锁,本文介绍一下innodb存储引擎的间隙锁,就以下问题展开讨论 1.什么是间隙锁?间隙锁是怎样产生的? 2.间隙锁有什么作用? 3 ...
- 视频+图文串讲:MySQL 行锁、间隙锁、Next-Key-Lock、以及实现记录存在的话就更新,如果记录不存在的话就插入如何保证并发安全
导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 27 篇. 下文还是白日梦以自导自演的方式,围绕"如何实现记录存在的话就更新,如果记录不存在的话就插入."展开本话题.看看 ...
- Mysql innodb 间隙锁
前段时间系统老是出现insert死锁,很是纠结.经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围.间隙锁的主要作用是为了防止出现 ...
- Mysql锁机制--间隙锁的危害
Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS employee; CREATE TABLE IF NOT EXISTS ...
随机推荐
- zabbix 报警发送企业威信
1.组册企业微信,创建应用 2.下载脚本文件: https://raw.githubusercontent.com/OneOaaS/weixin-alert/master/weixin_linux_a ...
- 你说说RPC的一个请求的流程是怎么样的?
前言 面试的时候经常被问到RPC相关的问题,例如:你说说RPC实现原理.让你实现一个RPC框架应该考虑哪些地方.RPC框架基础上发起一个请求是怎样一个流程等等.所以这次我就总结一波RPC的相关知识点, ...
- .NET 开源工作流: Slickflow流程引擎高级开发(九) -- 条件事件模式解释及应用
前言:在流程流转过程中,有时候需要条件模式的支持,这样可以使得流程流转更加灵活多变.比如在业务变量满足一定的条件时,可以启动特定配置的流程(或者位于主流程内部的子流程).本文主要描述条件启动和条件中间 ...
- robot framework error: [ ERROR ] Suite 'XXX' contains no tests or tasks.(解决方法)
robot framework 按照如下操作创建项目 一.创建项目 选择菜单栏file----->new Project Name 输入项目名称. Type 选择Directory. 二.创建测 ...
- 解决一次gitlab因异常关机导致启动失败
解决一次gitlab因异常关机导致启动失败 目录 解决一次gitlab因异常关机导致启动失败 1. 服务器异常关机 2. gitlab服务 2.1 进入gitlab容器内部 2.2 检查gitlab各 ...
- [cf1209E]Rotate Columns
题意也可以理解为这样一个过程: 对于每一列,将其旋转后选出若干行上的数,要求与之前的行都不同 用$g_{i,S}$表示第$i$列选出的行数集合为$S$的最大和,$f_{i,S}$表示前$i$列$S$中 ...
- [atARC084F]XorShift
如果异或变为加法和减法,那么根据扩欧,$k$合法当且仅当$k|\gcd_{i=1}^{n}a_{i}$ 换一种方式定义约数:$x$是$y$的约数当且仅当存在$p_{i}\in \{0,1\}$使得$\ ...
- [atARC107F]Sum of Abs
价值即等价于给每一个点系数$p_{i}=\pm 1$,使得$\forall (x,y)\in E,p_{x}=p_{y}$的最大的$\sum_{i=1}^{n}p_{i}b_{i}$ 如果没有删除(当 ...
- FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口
针对上一篇FastAPI(六十二)实战开发<在线课程学习系统>需求分析需求的功能,我们对需要的接口进行梳理,大概的规划出来现有的接口,作为我们第一版的接口的设计出版,然后我们根据设计的接口 ...
- Java跟JavaScript两者间的关系和区别
想必很多人在刚接触和认识Java的时候,都好奇它与JavaScript之间的关系,长得这么像,难道是出自同门的升级版?嗯,他们的发明者确实颇具渊源,而且客观来说,JS确实相较Java更加简洁大众,但它 ...