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 ...
随机推荐
- TDengine在浙商银行微服务监控中的实践
作者:楼永红 王轩宇|浙商银行 浙商银行股份有限公司(简称"浙商银行")是 12 家全国性股份制商业银行之一,总部设在浙江杭州,全国第13家"A+H"上市 ...
- Laravel/Lumen 分组求和问题 where groupBy sum
在Laravel中使用分组求和,如果直接使用Laravel各数据库操作方法,应该会得出来如下代码式: DB::table('table_a') ->where('a','=',1) ->g ...
- 官宣 .NET RC 2
我们很高兴发布 .NET 6 RC(Release Candidate) 2.它是生产环境中支持的两个"go live"候选版本中的第二个. 在过去的几个月里,团队一直专注于质量的 ...
- vue监听器watch & 计算属性computed
侦听器watch vue中watch是用来监听vue实例中的数据变化 watch监听时有几个属性: handle:其值是一个回调函数,就是监听对象对话的时候需要执行的函数 deep:其值true 或者 ...
- 关于 better-scroll 设置了以后无法滚动或不生效的问题
首先在mounted里面注册组件 例:let scroll = new BScroll("#commondityLeftList") 然后打印实例化对象,例:console. ...
- 『学了就忘』Linux基础命令 — 38、Linux中光盘的挂载
目录 步骤一:创建一个空目录 步骤二:找到光盘的设备文件名称 步骤三:挂载光盘 步骤四:访问关盘中的数据 步骤五:卸载挂载点 问题:挂载点为什么要使用空目录 提示:关于Linux系统中光盘的挂载,我们 ...
- adduser vs useradd
Always use adduser (and deluser when deleting users) when you're creating new users from the command ...
- Java学习(二十二)
学了一个在css中叫font的样式: 感觉还是挺好用的 不过要注意如果把font放在最后,其他会使用默认值,可能会覆盖掉前面的 例如新学的行高 在font中语法是 font:30px/40px &qu ...
- 在Winform中直接录入表格数据和在Vue&Elment中直接录入表格数据的比较
一般来说,录入数据的时候,我们都采用在一个窗体界面中,根据不同内容进行录入,但是有时候涉及主从表的数据录入,从表的数据有时候为了录入方便,也会通过表格控件直接录入.在Winform开发的时候,我们很多 ...
- win8中让cmd.exe始终以管理员身份运行
最近在学习配置本地服务器,在命令行启动mysql时总是由于权限不足而失败, Win+R -- cmd ,这样总是不能,还要找到cmd.exe右键以管理员身份运行cmd,再 net start mysq ...