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

MVCC(多版本并发控制)

一、什么是MVCC

MVCC是为了解决数据库在不加锁的前提下提升并发性和读取效率的一种思想

数据库有已下几种并发情况

  • 读-读:不会产生并发问题
  • 读-写:发生隔离性问题,可能导致脏读、幻读、不可重复度
  • 写-写:可能存在数据丢失

为了防止并发问题,一般采用两种读取方式;

  • 当前读:DML语句和加排它锁,select lock in share mode加共享锁,确保读取为最新数据
  • 快照读:读写时不加锁、可能读取到历史数据

当前读(加锁)+快照(MVCC)读保证了事务的隔离性

MVCC 就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现


二、MVCC实现原理 

三个部分:隐式字段+undo版本链+read view视图

2.1、隐式字段

表内的每行记录除了我们自定义的字段外,还有数据库隐式字段段DB_TRX_IDDB_ROLL_PTRDB_ROW_ID 

  • DB_TRX_ID :记录创建这条记录或最后一次修改该记录的事务 ID
  • DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本
  • DB_ROW_ID:隐含的自增 ID(隐藏主键),当前表没有主键,InnoDB 自动产生聚集索引

2.2、undo版本链 

不同的事务或相同事务对同一条记录修改是,会将当前记录先copy一份当undo log中,同时该记录的DB_TRX_ID会自增,DB_ROLL_PTR指向修改前记录的地址。以此形成版本链表


2.3、read view视图 

如上图,现在我们生成了4个版本,当select的时候会选取哪个版本呢?这时候就需要根据read view里维护的字段通过一定规则对比后最终确认所读取的版本

当然,不同隔离级别下生成read view的时机不同

RC级别下:每次select都会生成一个read view 

RR级别下:开启事务后第一个select生成read view,后续的select复用当前read view(由此可知在read view相同的情况下,根据一定规则匹配后读取到的版本肯定是相同的,也就解决了不可重复读的问题)

  • m_ids:未提交事务的DTX_ID的集合
  • creator_trx_id:创建read view视图视图的事务ID

总结一下:

当前事务或其它事务修改同一个数据时,会被undolog记录,并通过roll_point形成版本链,接着read view会根据里面维护的字段通过一定规则对比各个版本数据的隐式字段,最终匹配出可查询的版本具体为哪一个。当然,由于隔离级别不同,产生read view的时机不同,读取到的版本也不同,RC:每一次快照度都会产生read view、RR:第一次快照度后产生read view,后续复用

相关文章:

  • 双十一最畅销的商品、值得入手的数码好物推荐
  • 《面向对象软件工程》笔记——1-2章
  • 一文掌握Java Stream API
  • 【Python入门二】安装第三方库(包)
  • python的日志模块学习记录
  • FlinkCDC系列:数据同步对部分字段的处理,只更新部分字段
  • 手机测试—ADB详解
  • 电脑如何录制小视频
  • 七月论文审稿GPT第二版:从Meta Nougat、GPT4审稿到mistral、llama longlora
  • 69 内网安全-域横向CobaltStrikeSPNRDP
  • Hadoop相关知识点
  • 2023年是5G-A标准制定关键年 华为实现5G-A重大突破
  • Mysql与SeaweedFS数据不同步问题产生原因及解决办法
  • VSCode 设置平滑光标
  • 时序分解 | Matlab实现NGO-VMD北方苍鹰算法优化变分模态分解时间序列信号分解
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Fundebug计费标准解释:事件数是如何定义的?
  • Javascript 原型链
  • Laravel 中的一个后期静态绑定
  • LeetCode18.四数之和 JavaScript
  • log4j2输出到kafka
  • Mocha测试初探
  • Python十分钟制作属于你自己的个性logo
  • webpack4 一点通
  • 多线程事务回滚
  • 浏览器缓存机制分析
  • 数据结构java版之冒泡排序及优化
  • 译自由幺半群
  • 因为阿里,他们成了“杭漂”
  • 优化 Vue 项目编译文件大小
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 如何在招聘中考核.NET架构师
  • 整理一些计算机基础知识!
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (003)SlickEdit Unity的补全
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (AngularJS)Angular 控制器之间通信初探
  • (附源码)springboot教学评价 毕业设计 641310
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Google的Objective-C编码规范
  • (转)http协议
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .sh
  • [20161214]如何确定dbid.txt
  • [2021 蓝帽杯] One Pointer PHP
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Android] 240204批量生成联系人,短信,通话记录的APK