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

表象:快照读(非阻塞读)--伪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~+∞的区间。

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

-- 创建测试表
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;

插入以下数据:

不加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锁还会用在非唯一索引或者不走索引的当前读中
  • 非唯一索引都是到点的左开右闭区间

测试表 非唯一索引

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;

-- 第一个会话
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加锁 就是锁表了)

测试表 无索引

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

-- 第一个会话
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

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

  1. mysql 面试知识点笔记(二)查询优化及索引越多越好吗?

    2019独角兽企业重金招聘Python工程师标准>>> 问:如何定位并优化慢查询SQL? 根据慢日志定位慢查询sql 使用explain等工具分析sql 使用sql或者尽量让sql走 ...

  2. MySQL面试知识点追命连环问(三)锁机制、日志备份及分表策略

    ​上次我们讨论了MySQL的事务索引,SQL优化和处理器. MySQL面试知识点追命连环问(二)事务.索引及SQL优化 这次我们继续来追命连环问关于MySQL锁机制,日志备份和扩展性等相关的内容. 锁 ...

  3. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  4. java 面试知识点笔记(七)多线程与并发 上篇

    2019独角兽企业重金招聘Python工程师标准>>> 问:进程和线程的区别? 进程是资源分配的最小单位,线程是CPU调度的最小单位 所有与进程相关的资源,都被记录在PCB中 进程是 ...

  5. MySQL面试知识点汇总

    文章目录 数据库基础知识部分 为什么要使用数据库 什么是SQL 什么又是MySQL 数据库的三大范式是什么 Mysql有关权限的表都有哪几个 MySQL的binlog有有几种录入格式?分别有什么区别? ...

  6. MySQL面试知识点追命连环问(一)执行流程存储引擎查询缓存

    ​来了,朋友们,追命连环问系列之MySQL部分开始了.准备好了吗?本次连环问主要设计以下四个方面: MySQL执行流程 MySQL存储引擎 表字段如何设计 查询缓存 一,MySQL的执行流程 面试官: ...

  7. 彩云笔记java_java 面试知识点笔记(十三)多线程与并发-原理 下篇

    java线程池,利用Exceutors创建不同的线程池满足不同场景需求: newSingleThreadExecutor() 创建一个单线程的线程池.这个线程池只有一个线程在工作,也就是相当于单线程串 ...

  8. 网络编程学习笔记(非阻塞读和写)

    维护两个缓冲区:to容纳从标准输入到服务器的数据,from容纳从服务器到标准输出的数据 toiptr指向从标准输入读入的数据可以存放的下一个字节,tooptr指下一个必须写入到套接口的字节.有(toi ...

  9. reids mysql 面试_月薪3k的后端面试点-Mysql和Redis

    Mysql 索引 生成索引,建立二叉查找树进行二分查找 树的深度太深,IO太频繁 生成索引,建立B-Tree结构进行查找 生成索引,建立B±Tree结构进行查找 生成索引,建立Hash结构进行查找 B ...

最新文章

  1. 在XP SP3中启用支持NLA的远程桌面
  2. flex布局学习笔记
  3. Reference 字段的详情弹窗icon显示或者隐藏
  4. Nginx的SSL相关指令
  5. 豆瓣9.8分,周志明的《凤凰架构》,高屋建瓴,推荐(送书)
  6. C#操作SQLite数据库增、删、改、查 实例
  7. AndroidManifest.xml文件详解(receiver)
  8. Python基础—10-常用模块:time,calendar,datetime
  9. java moneyutils_java中每月等额与先息后本计算
  10. MFC 改变控件字体大小
  11. 网站发布后验证码不显示
  12. 1.看板方法---解决敏捷管理者的困境
  13. 帆软报表嵌套在iframe中,HTML的fieldset 定义的为自定义导出按钮
  14. 学习笔记(02):英特尔® OpenVINO™工具套件初级课程-如何加速视频处理进程?
  15. python绘制三维动态柱状图-使用pyecharts模块
  16. IP范围表示法(网络子网划分)
  17. PaddleOCR 图片文字提取
  18. Spark 提交执行源码学习
  19. 快乐共享(By Robinvane Suen)
  20. c语言 程序竞赛题,C语言程序设计竞赛题目(学生使用).doc

热门文章

  1. JAVA输出x和y和z_JAVA实例:输入三个整数x,y,z,请把这三个数由小到大输出-吾爱编程网...
  2. Java操作shell脚本
  3. 视觉工程师面试指南_选择正确视觉效果的终极指南
  4. 荒径 弗罗斯特_弗罗斯特庞克,颠覆性城市建设者
  5. 跟各位读者朋友分享下公众号运营策略
  6. 手把手教你接入前端热门抓包神器 - whistle
  7. A tutorial video for MindManager for free
  8. Linux 终端环境安装 L2TP 客户端
  9. 流水线上的思考——异步程序开发模型(2)
  10. SINOCES 2011