mysql 面试知识点笔记(七)RR如何避免幻读及非阻塞读、范式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

表象:快照读(非阻塞读)--伪MVCC (Multi-Version Concurrent Controll多版本并发控制)

内在:next-key锁(record锁+gap锁) rr serializabel 都支持gap锁

问:在rr下对主键索引或者唯一索引会用gap锁嘛?

如果where条件全部命中,则不会用gap锁,只会加record锁(行锁)

如果部分命中或全不命中则会加gap锁

比如查询id in(1,3,5) ,id是主键。 查到了 1、3 ,没有查到5则会加gap锁,在3~+∞的区间。

如果加锁是主键之外的索引 则会在当前索引以及主键索引上都上排他锁。如下图:

359bfe348344a93b69dbb265e052baa9cd7.jpg

-- 创建测试表
CREATE TABLE `tb`(
`name` varchar(10) NOT NULL,
`id` int(100) NOT NULL DEFAULT '0',
PRIMARY KEY(`name`),
UNIQUE KEY `unique_id` (`id`)
) ENGINE = INNODB DEFAULT CHARSET=utf8;

插入以下数据:

b640726391f5988c3c14fc58b5f695cf8c9.jpg

不加gap锁的情况

-- 第一个会话
SELECT @@tx_isolation;
set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;start TRANSACTION;
DELETE from tb  where id = 9;
-- 执行完delete之后执行事务2的insert 是成功的 因为id=9存在 只加了行锁
ROLLBACK;-- 第二个会话
SELECT @@tx_isolation;
set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;start TRANSACTION;
insert into tb VALUES('i',10);
ROLLBACK;

加gap锁的情况

-- 1、全不命中
-- 第一个会话
start TRANSACTION;
DELETE from tb  where id = 7;
-- 这里在执行事务2的insert 则会block 证明加了gap锁
ROLLBACK;-- 第二个会话
start TRANSACTION;
insert into tb VALUES('i',8);
ROLLBACK;-- 2、部分命中情况
-- 第一个会话
start TRANSACTION;
-- 这里命中5和9 7没有命中 在6~8加了gap锁 如果是in (5,6,9)  则不会加gap锁
select * from tb where id in (5,7,9) lock in share mode;
ROLLBACK;-- 第二个会话
start TRANSACTION;
-- 没有block
insert into tb VALUES('i1',4);
-- 有block
insert into tb VALUES('i2',7);
-- 有block
insert into tb VALUES('i3',8);
-- 没有block
insert into tb VALUES('i4',10);
ROLLBACK;
  1. Gap锁还会用在非唯一索引或者不走索引的当前读中
  • 非唯一索引cad036ae631f6db6861e1556ada26f08724.jpg都是到点的左开右闭区间

测试表 非唯一索引

CREATE TABLE `tb1`(
`name` varchar(10) NOT NULL,
`id` int(100) NOT NULL DEFAULT '0',
PRIMARY KEY(`name`),
KEY `non_unique_id` (`id`)
) ENGINE = INNODB DEFAULT CHARSET=utf8;

702ebe9b98ed58f7dbc5077f5db746d2789.jpg

-- 第一个会话
start TRANSACTION;
DELETE from tb1  where id = 9; 
-- 此时执行会话2的insert 会被block
ROLLBACK;-- 第二个会话
start TRANSACTION;
insert into tb1 VALUES('test',9);
#6-11的左开右闭区间
-- 不会block
insert into tb1 VALUES('test1',5);
-- 会block
insert into tb1 VALUES('test2',7);
-- 不会block
insert into tb1 VALUES('test3',12);
-- bb是主键c的左边 所以不会block
insert into tb1 VALUES('bb',6);
-- dd是主键c的右边 所以会block
insert into tb1 VALUES('dd',6);
-- e是主键f的左边 所以不会block
insert into tb1 VALUES('e',11);
-- g是主键f的右边 所以会block
insert into tb1 VALUES('g',11);
ROLLBACK;
  • 不走索引(会对所有的gap加锁 就是锁表了)32b5096f0c10680e22d4a556bf72ed933f3.jpg

测试表 无索引

CREATE TABLE `tb2`(
`name` varchar(10) NOT NULL,
`id` int(100) NOT NULL DEFAULT '0',
PRIMARY KEY(`name`)
) ENGINE = INNODB DEFAULT CHARSET=utf8;

c39af51a10e73b7e2ebc0915fc7a39a44c6.jpg

-- 第一个会话
start TRANSACTION;
DELETE from tb2  where id = 9; 
ROLLBACK;-- 第二个会话
start TRANSACTION;
-- 锁表 这里的insert是block的
insert into tb2 VALUES('test',2);
ROLLBACK;

MySQL InnoDB非阻塞式读的实现原理:MVCC

MySQL InnoDB使用MVCC来实现非阻塞式读,在这个模式下,数据库会为每个数据记录维护多个版本。在可重复读隔离级别下,事务第一次查询记录的时候,会记录下一个时间点,在该事务内如果再次(可是以不同的SELECT)查询相同的数据的话,事务只会取时间点前的记录版本,这样在不需要对数据加锁的情况下就实现了可重复读的隔离级别了,而且并发性能更好。在同一事务内多次查询同一数据,也不是就返回一个固定的记录版本,如果事务先查询了某个记录,随后自己又更新了这个数据,等再查询该数据的话,返回的就是自己更新过后的数据版本了。此处来自:https://ouyanggod.iteye.com/blog/2165668

范式参考:https://www.cnblogs.com/gdwkong/p/9012262.html

转载于:https://my.oschina.net/pentakill/blog/3045452

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pdf 奇数页插入页码_如何在Word 2013中的奇数页码上启动新部分

pdf 奇数页插入页码When working on a long document or a book in Word, it’s common to divide the document into sections or chapters. A common practice is to start each new section or chapter on an odd page. This is easily accomplished using sections in Word…

彻底攻克C语言指针

前面我们讲解了指针数组、二维数组指针、函数指针等几种较为复杂的指针,它们的定义形式分别是: int *p1[6]; //指针数组int *(p2[6]); //指针数组,和上面的形式等价int (*p3)[6]; //二维数组指针int (*p4)(int, int); //函数指针我相信大部分…

流水线上的思考——异步程序开发模型(2)

上一期我们讲了一个简单的流水线处理流程,正如我们在上期最后所说那样,这个简单的流水线处理流程对于后续有慢设备操作的业务来说,性能有可能偏低。今天我们来讨论一下如何提高性能的方法。首先让我们来大致区分一下一般业务的处理方式。目前…

java ReentrantLock 锁相关笔记

为什么80%的码农都做不了架构师?>>> ReentrantLock重入锁简单理解就是对同一个线程而言,它可以重复的获取锁。例如这个线程可以连续获取两次锁,但是释放锁的次数也一定要是两次 Lock locknew ReentrantLock(true);//公平锁 Lock …

计算机启动程序bios_如何构建自己的计算机,第三部分:准备BIOS

计算机启动程序biosSo you’ve carefully picked out some parts and built a computer, but it doesn’t really do anything…yet. Before we hop into installing your operating system, we need to take a quick look at the BIOS and prepare it for our operating syste…

PLSQL 之类型、变量和结构

1、类型 在《.Net程序员学用Oracle系列(5):三大数据类型》一文中详细地讲述了 Oracle 的基本数据类型,文中还提到,除基本数据类型之外,Oracle 还在语法上支持一些非固有数值类型。 事实上,Oracle 在语法上支持的数据类…

kindle图书免费下载_如何在Kindle上免费签出图书馆书籍

kindle图书免费下载Tired of paying so much for ebooks? Most libraries these days let you check out eBooks, for free, just like regular books. 厌倦了为电子书支付这么多钱? 如今,大多数图书馆都让您免费阅读电子书,就像普通书籍一样…

第五章 了解你的用户

第五章 了解你的用户逻辑人的争议:要学会把软件开发简单易用象牙塔式的开发:开发团队常年闭封在“高塔”之中,一门心思的做着魔法一般的软件。这些开发者根本就不知道用户会怎么样的使用他们所做的软件。我们应该避免这种象牙塔式的开发&…

总结之:CentOS 6.4系统裁减详解及装载网卡步骤

前言 随着接触Linux的慢慢深入、对Linux也有了一个基本认识了吧,慢慢的接触系统内核、系统配置文件、在了解Linux的系统启动流程后,现在来总结一下一个简单的Linux系统的裁减方法和步骤,一个只有内核文件和几个简单的命令的小Linux系统&am…

android 设备占用_如何查看正在占用Android设备的空间

android 设备占用When you picked up your shiny new Android device, you probably thought “yeah, this has plenty of storage. I’ll never fill it up!” But here you are, some number of months later with a full phone and no clue why. No worries: here’s how yo…

最近沉迷生意经

高度战略抢占顾客心智 速度战略 . 规模不够就谈发展速度,避开自己的劣势; . 发展速度快说明产品好,受欢迎度高; 钱是工具,从钱上解脱 . 不能被钱所困 . 放下钱,才能潇洒地使用钱 第一时间抢占顾客心智 . 核心点就是抢占…

mysql密码正确却提示错误, 不输入密码反而能登录

今天部署阿里云服务器, 发现之前可以连接的mysql服务器突然连接不上了, 密码我确认是正确的,但登录时就是显示密码错误, 很崩溃, 差点气得我就想重装mysql了。 好在经过几番苦寻找到了以下能解决我问题的资料, 成功解决了我的问题, 万分感谢,…

域用户权限|安装软件

如何让普通的域用户有安装软件的权限?现在给客户部署了活动目录,客户要求 普通的域用户也可以自己安装软件。不知道如何设置,希望大家帮帮忙!我告诉客户的做法如下:不知道可行性如何? 1、在域中新建一个域账…

c/c++ new delete初探

new delete初探 1,new有2个作用 开辟内存空间。调用构造函数。2,delete也有2个作用 释放内存空间调用析构函数。如果用new开辟一个类的对象的数组,这个类里必须有默认(没有参数的构造函数,或者有默认值的参数的构造函数)的构造函数…

php旧版本windows_Windows的旧版本中如何进行多任务处理?

php旧版本windowsConsidering that DOS was a single-tasking OS and the ties it had with early versions of Windows, just how did earlier versions of Windows manage to accomplish multi-tasking? Today’s SuperUser Q&A post looks at the answers to this ques…

批量提取视频文件信息(文件大小及时长)并统计

随着设备性能提高,视频文件越来越大了。服务器在对外提供视频服务时,需要承担越来越大的存储负担。一般提供1080P的AVC编码视频已满足多数观看需求。(1小时视频大约1.3G)此文要解决的就是关于已有大量高清视频(1小时超…

列出所有K个元素的子集-----2013年1月26日

问题描述:列出一个集合的元素个数为k的所有子集。思路:在字典顺序列出所有子集的基础上判断元素个数就可以了&#xff0c;比较简单。代码如下:1 #include <stdio.h>2 #define MAX 10003 4 int main()5 {6 int n5;7 int set[MAX]{1};8 int index0;9 int …

docker swarm的应用----docker集群的构建

一、docker安装 这里我们安装docker-ce 的18.03版本 yum -y remove docker 删除原有版本 #安装依赖包 [rootDocker ~]# yum -y install yum-utils device-mapper-persistent-data lvm2 #添加docker的CE版本的yum源配置文件 [rootDocker ~]# curl https://download.docker…

微信小程序 fire_如何在Fire TV和Fire TV Stick上侧面加载应用程序

微信小程序 fireAmazon’s Fire TV and Fire TV stick technically runs Android…but you wouldn’t know it from looking. Amazon has a wall of content for its set-top box, and doesn’t want Google (with its own competing platform) to crash the party. But even t…

PS 技巧

1. 钢笔的使用&#xff1a; 扣完一圈以后&#xff0c;按Ctrl回车键&#xff0c;会出现蚂蚁线&#xff0c;然后按CtrlJ 是复制扣出来的图层&#xff0c;右下角的框里会出现一个新图层&#xff0c;注意每个图层前边有一个小框&#xff0c;点一下是出现眼睛就可以显示该图层在中央…