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 ...
随机推荐
- CSS学习(二)选择符
元素选择符:以元素名作为选择符(span{ color: red; }) 群组选择符:将两个选择符用逗号隔开构成群组(span, div{ color: red; }) 通用选择符:通用选择符(*)将 ...
- TTMS 一个基于Java Swing的Socket通信的剧院票务管理系统
TTMS (Theater Ticket Management System) 点我进入github TTMS全称剧院票务管理系统,分为客户端和服务器端.服务器端可以接收客户端连接请求,客户端相当于我 ...
- 将python代码转化为c语言代码,提高运行效率
将python代码转化为c语言代码,提高运行效率 首先,需要安装cpython库: pip install cython 安装完成之后,写一段简单的代码,例如下面这个利用递归求斐波那契数列的函数,然后 ...
- Jquery的常用使用方法
1.获取单个checkbox选中项(三种写法)$("input:checkbox:checked").val()或者$("input:[type='checkbox']: ...
- 大爽Python入门教程 0-2 什么是IDE?python选什么IDE好?
大爽Python入门公开课教案 点击查看教程总目录 一 感受IDE 什么是IDE? 在这里,我并不想直接给出一个回答, 因为这个回答对初学者来说,可能有些抽象. 我想先带大家感受下IDE. 1 比较不 ...
- 程序员PS技能(四):程序员创建PSD文件、展示简单PSD设计流程,上传PSD至蓝湖,并下载Demo切图
前言 本篇是程序员仿照ui设计创建psd且切图五个按钮效果上传至蓝湖,本篇篇幅较长,整体完成一个目标,没有分篇幅了. 前提条件 已经安装了PS,已经在PS上安装了蓝湖插件,并且曾经已经上传 ...
- Ubuntu 软件安装
apt 使用apt安装,需要sudo 一些命令: sudo apt-get install git deb deb软件安装方法: sudo dpkg -I xxxx.deb 我们在Windows下安装 ...
- electron另一种运行方式
编写helloword 全局安装软件 npm install -g electron 快速编写html html:5 完整代码和流程: 1.index.html <!DOCTYPE htm ...
- 主动扫描之Nmap
主动扫描之Nmap 本文参考于李华峰等人的图书<Kali Linux2 网络渗透测试实践指南>2018年第1版 目录 主动扫描之Nmap 基本用法 主机发现 端口发现 扫描目标操作系统 扫 ...
- 使用 CSS 轻松实现一些高频出现的奇形怪状按钮
背景 在群里会有同学问相关的问题,怎么样使用 CSS 实现一个内切角按钮呢.怎么样实现一个带箭头的按钮呢? 本文基于一些高频出现在设计稿中的,使用 CSS 实现稍微有点难度和技巧性的按钮,讲解使用 C ...