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

详细说一下MVCC

MVCC 是 Multiversion Concurrency Control 的缩写,翻译过来就是多版本并发控制,是一种用于解决读写冲突的无锁并发控制的方案。它会为每个事务分配一个事务 ID,并且为每一次修改记录一个版本,版本和事务 ID 相关联,每条记录都有属于自己的版本链。读操作只读该事务开启之前数据库的快照。这样读操作不会阻塞写操作,写操作在不阻塞读操作的同时,也避免了脏读和不可重复读的问题,提高了数据库并发读写的能力。

MVCC的实现原理?

它主要依靠的是数据库中记录的三个隐藏字段,Undo Log 以及 Read View 实现的。

三个隐藏字段分别是:

  • db_row_id:隐藏主键,如果数据库中没有主键索引和非空的唯一索引,则利用这个字段创建聚簇索引。

  • db_trx_id:对这条记录做了最新修改的事务 ID。

  • db_roll_ptr:回滚指针,指向的是 Undo Log 中上一个版本的快照地址。

因为对于记录的每次修改都会在 Undo Log 记录一个版本的快照,所以这三个隐藏字段也会跟随着记录到保存在 Undo Log 中。

那么有了 Undo Log 和这三个隐藏字段,我们应该读取哪一个版本的快照呢,这就用到 Read View了。

Read View

Read View 主要是用来决定读取 Undo Log 中哪个版本的快照。

它中有几个重要的属性:

  • trx_ids,系统当前未提交的事务 ID 的列表。

  • low_limit_id,应该分配给下一个事务的id 值。

  • up_limit_id,未提交的事务中最小的事务 ID。

  • creator_trx_id,创建这个 Read View 的事务 ID。

每开启一个事务,我们就会从数据库中获取一个事务 ID,这个 ID 是自增的,事务 ID 大的能看见事务 ID 小的事务的数据变更记录。

因为每条记录都有一个 db_trx_id 字段,我们用它和 Read View 作比较。

  1. 如果 db_trx_id < up_limit_id,则表明开启该事务之前这条记录已经修改完了,那么这条记录对当前事务是可见的。

  2. 如果 db_trx_id > low_limit_id,则表明事务开启期间有事务对这条记录进行了修改并提交,那么这条记录对该事务是不可见的。

  3. up_limit_id < db_trx_id < low_limit_id,这种情况下就需要遍历 trx_ids 了。

    1. 如果 db_trx_id 存在于 trx_ids,则表明该事务开启过程中,未提交的事务已经提交了,那么这条记录对该事务是不可见的。

    2. 如果 db_trx_id 存在于 trx_ids,则表明该事务开启之前,这条记录已经修改了,那么这条记录对该事务是可见的。

当读取数据库中的某一条记录时,如果该记录对该事务可见,那么直接返回就可以了,反之则取出Undo Log 中上一个版本的记录和 Read View 进行比较,依次类推,直到能返回为止。

注意:MVCC + 间隙锁在一定程度上能够解决幻读,但是如果在事务开启过程中发生当前读,也是会出现幻读现象的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电脑强制退出程序快捷键
  • redis内存数据库的专业术语雪崩、击穿、穿透的名词解释
  • 二分法介绍
  • Python生成指定数量的随机XML文件
  • 572. 另一棵树的子树
  • Python自动化:Excel根据IP匹配网段获取所属源端口
  • 探索OpenCV:图像处理基础与实践
  • 如何解决“Intel (R) Wireless-AC 9560 160MHz 设备无法启动“?
  • SpringBoot下调用kettle脚本
  • Linux--数据链路层(macarp)
  • 实战演练:利用京东API一键抓取商品详情
  • SQL AI 工具:颠覆数据库管理与分析的创新力量
  • 如何在MySQL中禁止修改数据库表的特定列
  • 27. 聚合 DataFrame:探索数据的强大力量
  • 了解一下 CSS 的了解font-variant-alternates属性
  • [nginx文档翻译系列] 控制nginx
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android优雅地处理按钮重复点击
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Git的一些常用操作
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • log4j2输出到kafka
  • PHP面试之三:MySQL数据库
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Xmanager 远程桌面 CentOS 7
  • 翻译:Hystrix - How To Use
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 聊聊sentinel的DegradeSlot
  • 用element的upload组件实现多图片上传和压缩
  • 用Python写一份独特的元宵节祝福
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • nb
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #07【面试问题整理】嵌入式软件工程师
  • #define,static,const,三种常量的区别
  • #QT(串口助手-界面)
  • #图像处理
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)Hilt的基本概念和使用
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (C语言)球球大作战
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (十) 初识 Docker file
  • (十一)c52学习之旅-动态数码管
  • (四)opengl函数加载和错误处理
  • (四)React组件、useState、组件样式
  • (转)负载均衡,回话保持,cookie