什么是MVVC,为什么要用它

在mysql的也就是读不会加锁。

举个不是很准确的例子,有两个事务T1,T2,它们的id分别是1,2。由于事务id是递增唯一的,因此可以认为T2在逻辑上是后于T1发生的,当T2想要查询(select)某一行,这行的trx_id(最后修改本行数据的事务id)为1,那么我们就可以认为这一行对T2是可见的,因此返回改行数据。

其实这个例子问题很大,这也是为什么要写这篇文章记录一下

前置知识

在InnoDB中,每个行后面都有一些额外的字段,主要要知道DB_TRX_ID(最近修改行的事务ID),DB_ROLL_PTR(指向该行被修改的前一个状态),DELETE_VERSION(行是否被删除)。

当某个事务T对一行R做update操作时,若R对T是可见的(判断方法放在后面讲),将该行的DELETE_VERSION置为T的id,并将改行放入undo log中,而在表中会插入一条新的行R’,R’的DB_TRX_ID为T的id,DELETE_VERSION为空,DB_ROLL_PTR指向刚刚被打入undo log的那行

修改前↓

修改后↓

READ VIEW

其实ReadView可以理解成数据库中某个时间戳所有未提交事务的快照,ReadView类有这么几个参数:

m_ids:当前时间戳所有未提交的事务

min_trx_id:m_idx中最小的事务id

max_trx_id:当前时间戳InnoDB将在下一次分配的事务id

creator_trx_id:当前事务id

当创建一个ReadView对象时,也就知道了这个时间点上未提交事务的所有信息,从而能够通过这些信息实现锁的作用甚至增强。

有了这个ReadView,这样在访问某条记录时,只需要按照下边的步骤判断记录的某个版本是否可见:

如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。

如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。

如果被访问版本的trx_id属性值大于或等于ReadView中的max_trx_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。

如果被访问版本的trx_id属性值在ReadView的min_trx_id和max_trx_id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

正题

假如现在DBMS在处理三个事务,T2,T3,T5(T4已经提交了),那么开启下一个事务的时候,将会分配到一个id为6的id,也就是T6。现在T6要select这样一行:

首先会创建一个ReadView对象r:

r.m_ids=[T2,T3,T5],

r.min_trx_id=2,

r.max_trx_id=7

由于该行DB_TRX_ID=2, 而2!

如果该行是这样子的:

由于1

又如果是:

那就最后的改动就是在T6中进行的,也是对T6可见。

亦或是

CPU调度嘛,人家虽然后来的但也可能先你下手了 。因此由于8>=r.max_trx_id=7,所以该行对T6不可见,找一下DB_ROLL_PTR指向的行,由于是空,返回0行。(如果不为空,那么对所指向的行对同样的可见性判断)

再者:

虽然r.min_trx.id<=4

总结一下就是如下一个流程图:

copy的,tmin,tmax,tid0分别对应r.min_trx.id,r.max_trx_id,DB_TRX_ID。

回到开头

有些博客写的是

如果以小于或等于当前事务版本号为依据来判断行的可见性,那么就会漏掉依然活跃未提交的事务,在RR隔离级别下会产生不可重复度(离谱)。

RR和RC的区别

READ COMMITTED —— 每次读取数据前都生成一个ReadView

REPEATABLE READ —— 在第一次读取数据时生成一个ReadView

Featrue plus

其实在这样的MVVC下,InnoDB在RR隔离级别下就能避免了幻读,原因是不管是后面新的事务还是已经存在的未提交事务,他们新增的数据行对当前事务都是不可见的,而已提交的事务又不可能新增行,妙啊

参考博客:

MVCC ReadView介绍

mysql mvvc原理_Mysql MVVC笔记相关推荐

  1. mysql xid原理_MySQL数据库分布式事务XA实现原理分析

    [IT168 技术]MySQL XA原理 MySQL XA分为两类,内部XA与外部XA;内部XA用于同一实例下跨多个引擎的事务,由大家熟悉的Binlog作为协调者;外部XA用于跨多MySQL实例的分布 ...

  2. mysql show 原理_mysql事务的实现原理

    此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中  有一个整体的认识,如下图 如上图所示, ...

  3. mysql 删除原理_MySQL权限原理及删除MySQL的匿名账户

    MySQL权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证,不合法的用户拒绝连接: (2)对通过认证的合法用户赋予相应的权限,用户可 ...

  4. mysql 索引 原理_MySQL索引实现原理分析

    目前大部分数据库系统及文件系统都采用B-Tree(B树)或其变种B+Tree(B+树)作为索引结构.B+Tree是数据库系统实现索引的首选数据结构.在MySQL中,索引属于存储引擎级别的概念,不同存储 ...

  5. 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...

    前面讲了SQL优化以及索引的使用.设计优化了,那么接下来就到表的设计与优化啦!!!真实地去设计优化单表结构以及讲述多表设计基本原则(结合真实的生产环境的取舍来讲述). 文章结构:(1)单表设计与优化: ...

  6. mysql三大范式_MySQL学习笔记

    1.数据库结构设计 1.总-总体流程图 2.分-[提取属性]业务分析 评价的属性:{用户,课程主标题,内容,综合评分,内容实用,简洁易懂,逻辑分析,发布时间} 问答评论属性:{类型,标题,内容,关联章 ...

  7. java mysql实现原理_MySQL事务实现原理

    MySQL事务隔离级别的实现原理 知识储备 只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏 ...

  8. mysql分页概念_MySQL学习笔记之数据定义表约束,分页方法总结

    本文实例讲述了MySQL学习笔记之数据定义表约束,分页方法.分享给大家供大家参考,具体如下: 1. primary key 主键 特点:主键是用于唯一标识一条记录的约束,一张表最多只能有一个主键,不能 ...

  9. mysql 索引原理_MySQL InnoDB索引原理和算法

    也许你经常用MySQL,也会经常用索引,但是对索引的原理和高级功能却并不知道,我们在这里一起学习下. InnoDB存储索引 在数据库中,如果索引太多,应用程序的性能可能会受到影响:如果索引太少,又会对 ...

最新文章

  1. 2008年12月13日上海USB驱动开发深度解析讲座PPT
  2. arduino 土壤温湿度传感器_智慧农业温室大棚环境监测传感器
  3. 基于R语言的梯度推进算法介绍
  4. Java逆向基础之AspectJ的获取成员变量的值
  5. 创建单IP的***网络
  6. php eurl.axd,Http异常eurl.axd出错信息解决方法
  7. 三星Galaxy Note 10最新消息:将取消所有实体按键
  8. java-DateFormat
  9. log4j教程_Log4j教程
  10. coreldraw怎么扣圆形_coreldraw如何抠图?coreldraw抠图图文教程
  11. 第一次模拟考试总结反思
  12. 正态分布、指数分布的特征函数及期望与方差 - 随机过程
  13. 计算2个时间段的重叠天数
  14. 文墨绘学:大型“100元学英语”市场操作方案
  15. TSP之动态规划找最优解
  16. 如何定制B2C电商网站
  17. UE4 Pak 文件格式
  18. RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码
  19. ajas php 验证码_thinkPHP3.2.3利用Ajax前台实现验证码验证,但通过form表单的按钮提交后,验证码一直错误!如何解决?...
  20. jQuery vs JavaScript

热门文章

  1. php字符串转为时间戳,php字符串转时间戳
  2. 1219 spring3 项目总结
  3. MySQL的索引(二十三)
  4. sendto python_Python sendto似乎没有发送
  5. 苹果发布iOS 16.1 RC版,大量更新内容【附升级方法】
  6. docker配置defects4j + SimFix
  7. C#后台实现密码修改功能
  8. 背景图片自适应铺满整个手机屏幕
  9. 2021年10月视频行业用户洞察:平台积极拥抱变革探索新机遇
  10. 助力地质灾害专业监测,TDengine为和谐社会保驾护航