当前位置: 首页 > news >正文

mysql面试题——日志与MVCC

一:什么是MVCC?

多版本并发控制,更好的方式去处理读-写冲突,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。

二: 快照读与当前读

快照图:读取的是快照数据,不加锁的简单的 SELECT 都属于快照读

SELECT * FROM player WHERE ...

当前读:读取的是记录的最新版本,加锁的 SELECT,或者对数据进行增删改都会进行当前读

SELECT * FROM XX_table LOCK IN SHARE MODE;
SELECT * FROM xx_table FOR UPDATE;
INSERT INTO xx_table ...
DELETE FROM xx_table ...
UPDATE xx_table ...

三:MVCC实现原理

MVCC 的实现依赖于:隐藏字段、Undo Log、Read View。

  1. 隐藏字段:trx_id,roll_pointer在这里插入图片描述
  2. 在这里插入图片描述
  3. ReadView:Readview 就是事务在使用MVCC机制进行快照读操作时产生的读视图。当事务启动时,会生成数据库系统当前的一个快照,InnoDB 为每个事务构造了一个数组,用来记录并维护系统当前活跃事务的ID(“活跃”指的就是,启动了但还没提交)。

四:MVCC整体操作流程

  1. 首先获取事务自己的版本号,也就是事务 ID;
  2. 获取 ReadView;
  3. 查询得到的数据,然后与 ReadView 中的事务版本号进行比较;
  4. 如果不符合 ReadView 规则,就需要从 Undo Log 中获取历史快照;
  5. 最后返回符合规则的数据。
    ReadView的规则
    (1)如果被访问版本的trx_id属性值与ReadView中的 creator_trx_id 值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。
    (2)如果被访问版本的trx_id属性值小于ReadView中的 up_limit_id 值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。
    (3)如果被访问版本的trx_id属性值大于或等于ReadView中的 low_limit_id 值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。
    (4)如果被访问版本的trx_id属性值在ReadView的 up_limit_id 和 low_limit_id 之间,那就需要判断一下trx_id属性值是不是在 trx_ids 列表中。
    如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问。
    如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问

五:举例说明

读已提交(READ COMMITTED)隔离级别下:一个事务中的每一次 SELECT 查询都会重新获取一次Read View。
在这里插入图片描述

可重复读隔离级别下:因为一个事务只在第一次 SELECT 的时候会获取一次 Read View,而后面所有的 SELECT 都会复用这个 Read View
在这里插入图片描述

相关文章:

  • 数据链路层之VLAN基本概念和基本原理
  • Excel导入组件的封装以及使用页面点击弹出该弹框
  • 营销互动类小游戏策划与开发
  • 【Ratis】Grpc.proto文件里定义的一些RPC
  • Mysq8l在Centos上安装后忘记root密码如何重新设置
  • windows系统mobaxterm远程执行linux上ssh命令
  • Sublime text 添加到鼠标右键菜单,脚本实现
  • 【大模型】更强的 ChatGLM3-6B 来了,开源可商用
  • 虚假IP地址攻击的溯源方法
  • MDK5改造之格式化以及文件函数注释插件和主题应用
  • C/C++内存管理(含C++中new和delete的使用)
  • SpringCloud 微服务全栈体系(十八)
  • 第8关:定义一个名为PROC_AVGWEIGHT的有参数存储过程
  • MIT线性代数笔记-第21讲-特征值,特征向量
  • 使用idea如何快速的搭建ssm的开发环境
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【剑指offer】让抽象问题具体化
  • ➹使用webpack配置多页面应用(MPA)
  • httpie使用详解
  • JavaScript新鲜事·第5期
  • Java基本数据类型之Number
  • mongodb--安装和初步使用教程
  • Python打包系统简单入门
  • Python利用正则抓取网页内容保存到本地
  • Web标准制定过程
  • 产品三维模型在线预览
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 读懂package.json -- 依赖管理
  • 关于springcloud Gateway中的限流
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 区块链将重新定义世界
  • 什么是Javascript函数节流?
  • 责任链模式的两种实现
  • ​批处理文件中的errorlevel用法
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #Linux(make工具和makefile文件以及makefile语法)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (七)理解angular中的module和injector,即依赖注入
  • (一)80c52学习之旅-起始篇
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ***测试-HTTP方法
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .FileZilla的使用和主动模式被动模式介绍
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net MVC + EF搭建学生管理系统
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net程序集学习心得
  • .NET轻量级ORM组件Dapper葵花宝典