mvcc,全称multi-version concurrency control,即多版本并发控制。mvcc是一种多并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
我们知道,mysql在5.5后由myisam存储引擎改成了innodb存储引擎,主要是因为innodb是支持事务的,那么当多线程同时执行的时候,可能会出现并发问题。这个时候可能会出现一个能够控制并发的方法,mvcc就起到了这个作用。
MVCC主要靠undo log版本链与ReadView来实现。
Undo log主要用于事务回滚时恢复原来的数据。
mysql在执行sql时,会将一天逻辑相反的日志保存到undo log中。因此,undo log中记录的也是逻辑日志。
但mysql执行Insert语句时,会在undo log日志中记录本次插入的主键id。等事务回滚时,delete删除此id。
在执行update语句时,MySQL会将修改前的数据保存在undo log中。等事务回滚时,再执行一次update,得到原来的数据。
当MySQL执行delete语句时,会在undo log中保存删除前的数据。等事务回滚时,再执行insert,插入原来的数据。
数据库中的四大特性–原子性,即事务是不可分割的,要么全部成功,要不全部失败,其底层就靠undo log来实现。在执行某一条语句失败时,就会对之前事务的语句进行回滚。
在数据库的每行上,除了存放真实的数据以外,还存在3个隐藏的列:row_id、trx_id和roll_pointer
row_id,行号:
如果当前表有整数类型的主键,那么row_id的值就是主键的值如果没有整数类型的主键,则MySQL会按照字段的顺序选择一个非空的整数类型的唯一索引为row_id如果都没有找到,则会创建一个自动增长的整数作为row_id
trx_id,事务号:
当一个事务开始执行前,MySQL就会为这个事务分配一个全局自增的事务id。
之后该事务对当前进行的增、改、删除等操作时,都会将自己的事务ID记录到trx_id中。
roll_pointer,回滚指针:
事务对当前数据改动时,会将旧的数据记录到undo log中,在将数据写入当前行,且当前的roll_pointer指向刚才那个undo log,因此可通过roll_pointer来找到改行前一个版本。
当一直有事务对该行改动时,就会一直生成undo log,最终将会形成undo log版本链。
一开始,我们使用以下语句创建一个stduent表
CREATE TABLE `student` ( `id` INT ( 11 ) NOT NULL AUTO_INCREMENT, `name` VARCHAR ( 255 ) NOT NULL, `age` INT ( 11 ) NOT NULL, PRIMARY KEY ( `id` ) USING BTREE ) ENGINE = INNODB;
现在开启第一个事务,事务id为1,执行以下插入语句。
INSERT INTO student VALUES ( 1, "a", 24 );
那么当前的示意图如下:

因为该数据是新插入的,因此它的roll_pointer指向的undo log为空。
接着开启第2个事务,分配的事务id是2,执行以下修改命令。
UPDATE student SET NAME = 'b' WHERE id = 1;
现在的示意图变为:

当开启第3个事务,分配到事务id是3,执行以下修改命令。
新鲜水果网站销售模板
网站模板是能够具有交互性,能够包含更多活跃的元素,就有必要在网页中嵌入其它的技术。如:J*ascript、VBScript、Document Object Model(DOM,文档对象模型)、Layers和 Cascading Style Sheets(CSS,层叠样式表),这里主要讲J*ascript。那么J*ascript是什么东西?J*ascript就是适应动态网页制作的需要而诞生的
70
查看详情
UPDATE student SET age = 25 WHERE id = 1;
示意图变为:

每个事务对该行进行改动时,都会生成一个undo log,用于保存之前的版本,之后再将新版本的roll_pointer指向刚才生成的undo log。
因此,roll_pointer可以将这些不同版本的undo log串联起来,形成undo log的版本链。
首先需要理解一下快照读与当前读
快照读:简单的select查询,即不包括 select … lock in share mode, select … for update,可能会读到数据的历史版本。
当前读:以下语句都是当前读,总是读取最新版本,会对读取的最新版本加锁。
select ... lock in share mode select ... for update insert update delete
在事务执行每一个快照读或事务初次执行快照读时,会生成一致性视图,即ReadView。
ReadView的作用是,判断undo log版本链中的哪些数据对当前事务可见。
m_ids
在创建ReadView的那一刻,mysql中所有未提交的事务id集合。
min_trx_id
m_ids中的最小值
max_trx_id
mysql即将为下一个事务分配的事务id,并不是m_ids中的最大值。
creator_trx_id
即创建此ReadView的事务id
简要的示意图如下:

那么事务在执行快照读时,可以通过以下的规则来确定undo log版本链上的哪个版本数据可见。
如果当前undo log的版本的trx_id
如果当前undo log的版本的trx_id≥max_trx_id,说明该版本对应的事务在生成ReadView之后才开始的,因此是不可见的。
如果当前undo log的版本的trx_id∈[min_trx_id,max_trx_id),如果在这个范围里,还要判断trx_id是否在m_ids中:
在m_ids中,说明版本对应的事务未提交,因此是不可见的。 不在m_ids中,说明版本对应的事务已经提交,因此是可见的。
如果当前undo log的版本的trx_id=creator_trxt_id,说明事务正在访问自己修改的数据,因此是可见的。
当undo log版本链表的头结点数据被判定为不可见时,则利用roll_pointer找到上一个版本,再进行判断。如果整个链表中都没有找到可见的数据,则代表当前的查询找不到数据。
以上就是MySQL中MVCC机制是什么的详细内容,更多请关注其它相关文章!
# 创建一个
# 南充国内seo
# 铁岭seo引流推广公司
# 阜阳seo优化找哪家
# 域名时间与SEO
# 游戏推广员电话营销话术
# 南方关键词排名
# 装修网站建设公司
# app购物网站建设
# 抖音推广营销多少钱
# 泰州媒体网站优化优势
# MySQL
# 来实现
# 没有找到
# 最新版本
# 行号
# 会对
# 会在
# 主键
# 会将
# 镜像
# mvcc
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法
歌词怎么展示在|直播|间视频号?有什么注意事项?
Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型
iPhone17Pro如何连接蓝牙耳机_iPhone17Pro蓝牙设备配对与连接方法介绍
Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析
学习通网页版个人登录_学习通网页版个人账户登录入口
PHP中获取HTTP响应状态消息:方法与限制
使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式
《飞猪旅行》购买汽车票方法
Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件
小米手机截图后如何查看历史_小米手机截图历史记录查看方法
嘀嗒顺风车如何开具电子发票
百度识图图像分析 百度识图识别平台
发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?
实时数据流中高效查找最小值与最大值
高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践
163邮箱网页版入口 163邮箱在线使用
t3出行如何使用微信支付
win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】
J*aScript与HTML元素交互:图片点击事件与链接处理教程
Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践
Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧
search中maxlength属性用法解析
《美篇》取消会员自动续费方法
虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口
mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧
Animex动漫社正版在线入口 Animex动漫社动漫官方观看网
Python实战:高效处理实时数据流中的最小/最大值
Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置
Win10截图远程协助 Win10远程桌面截屏法【场景应用】
百度网盘如何设置上传限额
ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算
在J*a里什么是行为抽象_抽象行为对代码复用的提升作用
鸿蒙单条备忘录如何加密
Win11如何分屏操作_Win11多窗口分屏技巧
如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局
CSS如何控制元素外边距_margin实现布局间隔
iPhone14开启Apple TV遥控设置
漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐
Yandex浏览器官方入口_Yandex搜索引擎中文版
C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用
OpenWeatherMap API:通过城市名称获取天气预报数据指南
胃动力不足?试试这5个调理方法
《360浏览器》设置摄像头权限方法
《一起考教师》账号注销方法
AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用
Coolpad5890 ROM刷机包
抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系
Go App Engine 项目结构与包管理深度指南
苹果自助维修计划支持哪些设备机型
2023-06-03
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。