IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【Mysql】什么是MVCC? -> 正文阅读

[大数据]【Mysql】什么是MVCC?

一、有什么用?解决了什么问题

mvcc多版本并发控制,为了提高是数据库并发性能,来解决我们的读写冲突问题,以不加锁的方式来解决读写冲突问题
在这里插入图片描述
在这里插入图片描述

二、靠什么实现

隐藏字段

数据库的表在定义的时候,除了我们声明的字,另外还会包含一些隐藏字段
DB_TRX_ID:最近修改的事务ID,创建这条记录或者最后一次修改该记录的事务id
DB_ROLL_PTR:回滚指针,指向了记录的上一个版本
DB_ROW_ID:隐藏主键,如果表没有主键的话,会自动生成一个6字节的rowId
执行步骤:
1.加锁
2.把老数据拷贝到undolog
3.修改数据
4.将回滚指针指向老记录
5.事务提交释放锁

undolog

回滚日志,在执行inser delete updata 操作时时候,方便回滚的日志
undulog会形成一个版本链表,链首存的是版本的最新旧纪录,链尾存储的是版本最旧的旧记录。
undulog版本不会一直叠加,purge线程会进行异步删除

案例

事务一:插入一条语句,此时上一个记录的版本地址为null
在这里插入图片描述

事务二:将name修改为李四
1.加锁
2.将nane为张三(修改之前你的数据拷贝到undolog)
在这里插入图片描述

3.修改数据
在这里插入图片描述
4.将回滚指针指向老记录
name	age	gender	DB_TRX_ID	DB_ROLL_PTR	DB_ROW_ID
李四	17	man	2	0x123	1

事务三:将age修改为21
2.将nane为李四(修改之前你的数据拷贝到undolog)
在这里插入图片描述
3.修改数据
时刻	事务1	事务2	事务3
t1	begin;	begin;	begin;
t2		update;
commit;	
t3	select;

4.将回滚指针指向老记录
在这里插入图片描述

readView

读视图,在事务进行快照读的是产生的读视图,保存的并不是实际的数据,而是事务的相关信息
包含三个非常重要的字段
trx_list:当前系统活跃的事务ID的列表
up_limit_id:活跃例表中事务ID最小的值
low_limit_id:系统尚未分配的下一个事务ID

案例一

此时select是读取的到最新数据的
在事务1t3时间段,select操作会触发快照读,就会产生读视图
在这里插入图片描述

可见性算法

1.首先比较DB_TRX_ID<UP_LIMIT_ID如果小于,则当前事务能看到DB_TRX_ID所在的记录,如果大于等于进入下一个判断。
2.接下来判断DB_TRX_ID>=low_limit_id,如果大于等于则代表DB_TRX_ID所在的记录在ReadView生成后才出现,那么对于当前事务肯定不可见,如果小于,则进入下一个判断
3.判断DB_TRX_ID是否在活跃事务中,如果在,则代表ReadView生成时刻,这个事务还是活跃状态,还没有Commit ,修改的数据,当前事务是看不到的,如果不在,则说明这个事务在ReadView生成之前就已经开始Commit,那么修改的结果是能看见的。

案例二

select🩱:所产生的快照读ReadView

select👙;所产生的快照读ReadView

根据我们现在的理解select👙读取的数据是最新的数据?
但是并不是最新数据,案例一和select👙所产生的readView是一样的,可见性算法也是一样的,为什么读取不到最新数据。
因此大胆做一个猜测,select🩱;部分使用的是readView跟select👙的readView是同一个readView
除了事务ID其他都和select🩱产生的readView一致

通过这个readView读取不到最新数据的,因此第二次的ReadView沿用了第一次产生的ReadView

三、什么时候沿用readView?

这个时候就是和隔离级别挂钩了
如果是RC隔离级别,那么每次在进行快照读的首都会生成新的ReadView
如果是RR隔离级别,那么只有在当前事务第一次进行快照读的时候生成readView,之后的快照读都会沿用第一次生成的readView

总结

隔离级别是可调控的参数,通过用户控制这个可调控的参数,控制每次看到的数据,MVCC和ReadView是实现机制的体现。不管是RC还是RR都避免不了产生幻读的问题
幻读
幻读是通过加锁的方式来解决的
产生幻读的根本原因:当前读和快照读一起使用,如果一个事务只有一个快照,那么永远不会出现幻读原因。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:56:33  更:2022-07-20 18:58:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 4:26:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码