MySQL的MVCC

什么是MVCC:

MVCC是多版本并发控制器,是通过记录历史半本书,解决读写并发冲突问题,避免了读数据时加锁,提高了事务的并发性能。

讲历史数据存储在undo log中,结构逻辑上类似于一个链表,MySQL数据行上的两个隐藏列,一个是事务ID,一个是指向undo log的指针

事务开启后,执行第一条select语句的时候,会创建ReadView,ReadView记录了当前未提交的事务。通过与历史数据的事务ID进行比较,就可以根据可见性规则进行判断,判断这条记录是否可见,如果可见就直接将这条数据返回个客户端,如果不可见就继续王undo log版本链查找第一个可见的数据。

我们每一条记录都有两个隐藏列,一个是事务ID,一个是指向历史数据undo log的指针,然后ReadView有四个字段,分别是创建ReadView的事务ID,活跃事务ID列表,活跃事务ID列表中的最小ID,下一个事务ID。主要有这几种判断规则:

  • 如果记录事务的ID小于活跃事务ID列表中的最小ID,就说明记录在创建ReadView前就生成好了,所以该记录当前事务是可见的。
  • 如果记录事务的ID大于等于下一个事务的ID,就说明该记录是在创建ReadView后才生成的, 所有该记录是当前事务不可见的。
  • 如果记录隐藏列的事务ID在最小的ID和下个事务的ID之间,这时候就需要看记录的事务ID是否在活跃事务的ID列表中
    • 如果记录的事务ID在活跃事务的ID列表中,说明修改该记录的事务还没提交,所以该记录是不可见的
    • 如果记录的事务ID不在活跃事务ID的列表中,说明修改记录的事务已经提交了,那么该记录就是可见的。
相关推荐
火山上的企鹅19 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
阿狸猿19 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩19 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮19 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@20 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
志栋智能20 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化
syt_biancheng20 小时前
Redis初识
数据库·redis·缓存
cmes_love21 小时前
股票逐笔level2历史行情下载十档订单薄五档tick分钟下载分享
数据库·区块链
仙俊红21 小时前
SQL 调优需要掌握的知识
数据库·sql
fofantasy1 天前
NSK LH12AN 微型导轨技术手册
运维·网络·数据库·经验分享·规格说明书