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

MVCC:多版本并发控制案例分析(一)

(笔记总结自b站马士兵教育课程)

一、简介

MVCC:全称multi-version Concurency control,多版本并发控制,是为了解决并发读写问题存在的。MVCC的实现原理由三部分组成:隐藏字段、undolog、readview。

二、概念补充

当前读:读取的总是最新的数据,例如update、insert、delete等等。

快照读:读取的是历史的数据,例如select。

数据库并发场景:

①读读:不会产生任何问题,也不需要进行并发控制。

②读写:会存在数据安全问题,比如脏读、幻读、不可重复读,可以通过加锁的方式来解决,但是会存在性能安全问题。

③写写:会存在数据安全问题,比如更新丢失问题。

三、隐藏字段和undolog

mysql所对应的行记录除了我们自定义的字段之外,mysql会默认的添加一些隐藏字段,对于用户是不可见的。

DB_TRX_ID创建这条记录或者最后一次修改该记录的事务id
DB_ROLL_PTR回滚指针,指向这条记录的上一个历史版本
DB_ROW_ID隐藏主键,当表创建的时候没有设置主键,那么会生成一个6字节的rowid

(事务id:mysqlserver自动赋值,并且是递增的)

事务1新增一条记录:

nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
ABC101NULL1

undolog:回滚日志,表示在进行insert、delete、update操作的时候产生的方便回滚的事务。

事务2修改name=DEF:

nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
DEF1020x1231

此时undolog代码块:

 

nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
ABC101NULL1

事务2中的DB_ROLL_PTR 中的地址记录的是事务1版本的数据在undolog的数据。

事务3修改age=12:

nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
DEF1230x4561

此时undolog代码块:

 

nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
DEF1020x1231
                
nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
ABC101NULL1

事务3中的DB_ROLL_PTR 中的地址记录的是事务2版本的数据在undolog的数据,事务2中的DB_ROLL_PTR 中的地址记录的是事务1版本的数据在undolog的数据。

我们发现undolog最终会变成一个链表,链首表示的是最新的旧纪录,链尾表示的是最旧的旧纪录,undolog链表不会无限增加,后台有一个purge的线程来对undolog进行维护,当不需要的时候就会进行删除,在undolog删除的时候会分为两类,insert对应一类undolog,只要事务提交就可以删除,update、delete对应一类undolog,除了事务提交之后,还要保证mvcc不用才会删除。

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

相关文章:

  • 以数据为中心的安全市场快速增长
  • AUTOSAR汽车电子嵌入式编程精讲300篇-经典 AUTOSAR 安全防御能力的分析及改善(下)
  • AI绘图提示词Stable Diffusion Prompt 笔记
  • xml元素值需要保留space
  • Eclipse开源代码下载
  • python多线程、进程
  • Vue基础之模板语法介绍
  • 【SLAM】 前端-视觉里程计之特征点
  • Android笔记(二十九):利用python自动生成多语言
  • 【C++STL基础入门】list的运算符重载和关于list的算法
  • 查找内轮廓(孔洞)
  • Git(6)——GitHub
  • 【RocketMQ专题】快速实战及集群架构原理详解
  • [设计模式] 浅谈SOLID设计原则
  • 基于Java+SpringBoot+Vue的旧物置换网站设计和实现
  • Java基本语法2
  • 【数据结构】树的存储结构;树的遍历;哈夫曼树;并查集
  • CSS选择器练习小游戏
  • Python运算符、函数与模块和程序控制结构
  • 微服务保护-Sentinel
  • Doris 导出表结构或数据
  • SELECT * from t_user where user_id = xxx,可以从那几个点去优化这句sql
  • 解决报错 java.lang.IllegalArgumentException: Cannot format given Object as a Date
  • 【Git】03-GitHub
  • Java手写最短路径算法和案例拓展
  • 深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战
  • 基于matlab实现的多普勒脉冲雷达回波仿真
  • Linux服务器中安装Anaconda+Tensorflow+Keras
  • ubuntu+.net6+docker 应用部署教程
  • Spring常见面试题总结