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

MySQL 学习二 MVCC

MVCC是多版本并发控制。目的是让读写能够并发。
是innodb通过undo log记录数据变更的版本信息实现的。
每个事务读到的版本是不一致的。同一个事务中,用户只能看到当前事务中创建的快照的内容(在事务开始之前就已经存在的数据),以及事务本身的操作。
MVCC的使用场景:在事务隔离级别读已提交和可重复读才会使用到。
读已提交:
可重复读:整个事务中,每次读取数据都用的是同一个read view。

1.MVCC的实现原理

三个方面:
1 隐藏字段
2 undo log
3 read view

2.隐藏字段

DB_TRX_ID 对数据进行新增或修改的最后一条事务id(删除视为修改)。事务id是递增的。
DB_ROLL_PTR 滚动指针,指向写入回滚段的撤销日志记录。Undo log中记录的多个版本之间用这个指针相连。
DB_ROW_ID 行id,如果表中没有主键,没有唯一非空索引。则mysql会自动将这个字段作为聚簇索引。(这个字段与MVCC实现相关不大)
在这里插入图片描述

3.Undo log的存储结构

场景:
当有一个事务要修改数据。
第一步:获取排他锁。
第二步:将当前数据行复制到undo log中,作为旧版本。
第三部:复制完之后,修改改数据,并且trx_id递增,并将roll_ptr指向undo_log中的旧版本。
在这里插入图片描述

4.Read view

Read view是读操作可见性(判断某个版本的数据是否对当前事务可见)判断的核心。Read view存储在内存中,不会写到磁盘上。
创建时机:在事务开启后第一个select开启,才会去创建read view。
在read view中可能会出现不应该被当前事务看到的其他活跃的事务列表。因为活跃的事务还没有提交,所以活跃的事务的数据,当前事务是不能看的。
当用户读取某一行数据时,会将数据的rtx_id与read view中的一些数据进行比较。
Read view中的关键数据:
m_creator_trx_id:创建该Read View的事务ID。
m_ids:创建Read View时系统中所有未提交的事务ID集合(活跃事务列表),不包含当前事务Id。
min_trx_id:m_ids中的最小事务ID,表示最早未提交的事务。
max_trx_id:创建Read View时系统将分配的下一个事务ID(即当前最大事务ID + 1)。

可见性规则:
若数据的DB_TRX_ID(记录最近修改的事务ID)等于m_creator_trx_id,说明是当前事务修改的,可见。
若DB_TRX_ID < min_trx_id,说明数据的当前版本在Read View创建前已提交(上一次造成数据修改的事务已经提交了),可见。
若DB_TRX_ID ≥ max_trx_id,说明数据的当前版本在Read View创建后生成(当前造成数据修改的事务实在read view生成之后开始的,而当前事务要读取的肯定是在造成数据修改事务之前的版本),不可见。
若min_trx_id ≤ DB_TRX_ID < max_trx_id:若DB_TRX_ID在m_ids中,说明该版本未提交,不可见。否则,说明该版本已提交,可见。

如果数据的当前版本不可见,那么沿着undo log中的版本链查看数据的上一个版本是否可见,直到版本可见或者版本链到头。

http://www.lryc.cn/news/595766.html

相关文章:

  • IBGP互联(ensp)
  • 【nginx】隐藏服务器指纹:Nginx隐藏版本号配置修改与重启全攻略
  • Unity中,Panel和 Canvas的区别
  • 数字签名(Digital Signature)
  • VR技术在元宇宙游戏中的作用及发展前景深度分析
  • A316-V71-Game-V1:虚拟7.1游戏声卡评估板技术解析
  • Leetcode—692. 前K个高频单词【中等】(桶排序)
  • PyTorch武侠演义 第一卷:初入江湖 第4章:损失玉佩的评分风波
  • 【AI学习从零至壹】Transformer
  • 02-netty基础-java四种IO模型
  • Java设计模式揭秘:深入理解模板方法模式
  • 详解FreeRTOS开发过程(二)-- 列表和列表项
  • 【前端】ikun-pptx编辑器前瞻问题二: pptx的压缩包结构,以及xml正文树及对应元素介绍
  • 机器学习模型视角下的市场联动机制:美元美债与黄金3400价格的VAR向量自回归分析
  • 面向对象高级:static
  • linux c语言进阶 - 进程,通信方式
  • VRRP技术
  • 从零构建实时通信引擎:Freeswitch源码编译与深度优化指南
  • 3秒请假:华润啤酒AI助手“哆啦”的轻巧落地与深度思考
  • 【洛谷】用两个数组实现静态单链表、静态双向链表,排队顺序
  • 基于JAVA实现基于“obj--html--pdf” 的PDF格式文本生成
  • Android perfetto 工具使用
  • 使用vue-pdf-embed发现某些文件不显示内容
  • Stirling PDF本地PDF编辑器:cpolar内网穿透实验室第628个成功挑战
  • css3地球转动模型(动态数据)
  • vue3实现高性能pdf预览器功能可行性方案及实践(pdfjs-dist5.x插件使用及自定义修改)
  • fuse低代码工作流平台概述【已开源】-自研
  • 面试题:sql题一
  • Elastic Cloud 简化版:GCP Marketplace
  • 【Java SE】Object类