mysql中mvcc实现机制和原理

news2024/9/23 14:33:40

目录

1.什么是mvcc?

2.mvcc中的快照读和当前读有什么区别和联系?

3.mvcc的作用是什么?

4.mvcc的实现机制和原理是什么?


1.什么是mvcc?

        mvcc全称是(Multi-Version Concurrency Control) 多版本并发控制,是数据库管理过程中的一种并发控制方式。数据库库中的并发控制一般是加锁。线程在操作共享资源时,需要加锁解决并发访问控制。锁又分为乐观锁和悲观锁。

      悲观锁:一上来,认为数据库会发生并发冲突,先锁住数据,不允许其他事物操作,直到本事务提交为止。

      乐观锁:在不锁定的情况下,更新数据,如果发现版本不一致,不更新数据,通过增加版本号比对来实现,还有cas等方式。

      mvcc本质是一种乐观锁的实现方式

2.mvcc中的快照读和当前读有什么区别和联系?

     mvcc有两种读的形式:快照读和当前读

     快照读:读写不冲突,每次读取到快照数据。例如 普通的select语句。

     当前读:每次读取到当前的最新数据。例如 select ...for update/select ... lock in share mode/delete /delete/insert

在不同的隔离级别下,快照读和当前读的读取到的数据可能不同

      在repeated-read隔离级别下,快照度可能读取的不是最新的数据,当前读读取的是最新的数据。

      在read committed隔离级别下,快照读和当前读读取的是最新的数据,快照度等价于当前读

3.mvcc的作用是什么?

        mysql默认的隔离级别是可重复读,快照读(select语句),使用mvcc解决了幻读的问题当前读(select ... for update) ,通过(next-key-lock)记录锁和间隙锁来解决幻读。

        mvcc在很大程度上避免了幻读,但是没有彻底的解决。有下面的两个场景没有解决幻读

案例1 对于快照读 事务A更新了事务B已经插入的记录,A事务两次查询结果记录条数不一致

user表数据

id

name

age

1

小张

11

2

小李

22

3

小王

33

4

小赵

44

id

事务A

事务B

1

begin

begin

2

select * from user where id=5

3

insert into users values(5,"小花",23)

commit;

4

update users set name="小明" where id=5

5

select * from user where id=5

       事务A的第1行和第5行的查询结果条数不一样,发生了幻读。

案例2 对于当前读 事务A先执行快照读,事务B插入了一条记录,事务A再执行当前读,导致两次查询结果记录数不同

还是上面的user数据集

id

事务A

事务B

1

begin

begin

2

select * from user where id>=1

3

insert into users values(5,"小花",23)

commit;

4

select * from user where id>=1 for update

       事务A的第1行和第4行的查询结果条数不一样,发生了幻读。

解决方案:事务开启后,先执行一次当前读 select for update,它会对当前事务加next-key-lock,避免其他事务插入记录。

4.mvcc的实现机制和原理是什么?

     mvcc是通过数据库的三个字段DB_TRX_ID(事务id),DB_ROLL_PTR(回滚指针),isDelete(是否删除的字段),undoLog(回滚日志)和read-view(读视图)来实现mvcc的可见性算法

     read-view是每个事务在进行一个select语句(快照读)时,产生一个read-view(读视图)有三个字段alive_trx_list,up_limit_id,low_limit_id,具体含义如下

    alive_trx_list:正在活跃的事务id列表

    up_limit_id:当前最小的事务id

    low_limit_id:当前最大事务id+1

    TRX_Id:当前记录的事务id

可见性算法分三种情况

     1. TRX_Id<up_limit_id|| TRX_Id==CUR_TRX_ID 可见,返回对应的记录

     2. TRX_Id>=low_limit_id 不可见 通过回滚指针找到上一条记录,继续判断,直到指针为空

     3. TRX_Id in alive_trx_list 不可见,事务未提交,通过回滚指针找到上一条记录,继续判断,指针指针为空,否则可见,返回对应的记录

     可见性算法执行流程图如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

keras+IMDB情感分析

目录简介IDMB数据集数据预处理数据加载数据清洗保存经过清洗后的数据训练测试数据集分割文字编码词嵌入模型构建模型训练训练效果模型评分模型预测及混淆矩阵查看F1 Score、召回率等信息预测新的影评总结本博客参考&#xff1a; 【python自然语言处理 周元哲著】 【keras中文文…

数据库索引篇(二叉树/B-Tree)对比结构讲解

我们可以先看一下 二叉树的一个结构 简单将数据分成左右两侧 左侧小于36 右侧大于36 在下面再以这种方式继续划分 但二叉树的结构就有一个非常大的弊端 如果我们后续插入的数据全部小于 或 大于36 他就会 变成这样 一个链表 查询效率大大降低 因为 比如 你想找什么数据 都会…

岁月闲思——时间给我地思考

岁月闲思——时间给我地思考 2022年6月10日&#xff0c;明天又一个周末&#xff0c;成人地时间总是让人感觉一天很慢&#xff0c;一周以及一年反而很快。 下班到家&#xff0c;吃过长辈做的手工凉皮&#xff0c;得空坐在电脑面前敲击点文字&#xff0c;记录下时间留给自己地印…

Docker--consul

目录 前言 一、Consul 简介 1.1、 consul 概述 1.2 、consul 的两种模式 1.3、consul 提供的一些关键特性 二、Consul 容器服务更新与发现 三、consul 部署 3.2、查看集群信息 四、registrator服务器 consul-template 五、consul 多节点 前言 服务注册与发现是微服…

软件测试面试十大必考题目(通用)

目录 &#xff08;1&#xff09; 为什么想进本公司&#xff1f; &#xff08;2&#xff09; 喜欢这份工作的哪一点&#xff1f; &#xff08;3&#xff09; 自己的优缺点为何&#xff1f; &#xff08;4&#xff09; 对公司的了解有多少&#xff1f; &#xff08;5&#xf…

C++创建多线程的方法总结

下个迭代有个任务很有趣&#xff0c;用大量的线程去访问一个接口&#xff0c;直至其崩溃为止&#xff0c;这就需要多线程的知识&#xff0c;这也不是什么难事&#xff0c;总结一下C中的多线程方法&#xff1a;std、boost、pthread、windows api。 目录 一、多线程预备知识 二…

图解浏览器渲染页面详细过程

渲染详细过程 产生渲染任务&#xff0c;开启渲染流程 当浏览器的网络线程收到 HTML 文档后&#xff0c;会产生一个渲染任务&#xff0c;并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下&#xff0c;渲染主线程取出消息队列中的渲染任务&#xff0c;开启渲染流程。…

IDEA 常用快捷键回顾

一 Alt 数字键 1. Alt 1: 打开项目 2. Alt 2: 打开Favorites 3. Alt 3: 打开Find 4. Alt 4: 打开Run 5. Alt 5: 打开Debug 6. Alt 6: 打开当前所在文件 7. Alt 7: 打开Structure 8. Alt 8: 打开Services 9. Alt 9: 打开Git日志 二 Ctrl 其他键 1. Ctrl…

【Flink】详解JobGraph

概述 JobGraph 是 StreamGraph 优化后的产物&#xff0c;客户端会将优化后的 JobGraph 发送给 JM。接下来的文章涉及到一些前置知识点&#xff0c;没有看前几期的小伙伴最好看一下前几期&#xff1a; 【Flink】详解StreamGraph【Flink】浅谈Flink架构和调度【Flink】详解Flin…

【Flutter入门到进阶】Dart进阶篇---进阶用法

1 Dart对象扩展 1.1 extension 1.1.1 介绍 可以在不更改类或创建子类的情况下&#xff0c;向类添加扩展功能的一种方式。灵活使用 extension 对基础类进行扩展&#xff0c;对开发效率有显著提升。 1.1.2 需求 在开发项目中碰到需求&#xff1a;将单位为分的数值转换成单位为…

RabbitMQ(黑马spring cloud笔记)

MQ 目录MQ一、同步通讯和异步通讯1. 同步通讯2. 异步通讯二、RabbitMQ1. 部署2. 架构3. 常见消息模型3.1 基本消息队列&#xff08;Basic Queue&#xff09;3.2 工作消息队列&#xff08;Work Queue&#xff09;3.3 发布订阅&#xff08;Publish、Subscribe&#xff09;4. 消息…

TPAMI 2022 | RC-Explainer:图神经网络的强化因果解释器

文章目录 一、论文关键信息二、基础概念三、主要内容1. Motivations2. Insights3. 解决方案的关键四、总结与讨论CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题:Reinforced Causal Explainer for Graph Neural Networks 期刊信息:IEEE Transact…

【C++】内存管理

&#x1f345;不同的数据放在不同的地方&#xff0c;需要内存管理 目录 ☃️1.C/C中的内存分布 ☃️2.C语言中动态内存管理方式 ☃️3.C内存管理方式 &#x1f41d;3.1 new/delete操作内置类型 &#x1f41d;3.2 new和delete操作自定义类型 &#x1f41d;3.3 operator n…

FISCO BCOS节点扩容和使用console进行群组扩容

一、安装并启动FISCO BCOS 搭建单机单群组4节点的教程查看&#xff1a;https://blog.csdn.net/yueyue763184/article/details/128924144?spm1001.2014.3001.5501 二、下载扩容脚本 在fisco目录下输入以下命令&#xff1a; curl -#LO https://raw.githubusercontent.com/FI…

155、【动态规划】leetcode ——474. 一和零:三维数组+二维滚动数组(C++版本)

题目描述 原题链接&#xff1a;474. 一和零 解题思路 &#xff08;1&#xff09;三维数组 本题是要在已有的字符串中&#xff0c;找到给定的m个0和n个1&#xff0c;组出最大的子集。将字符串集合中的各个字符串看作物品&#xff0c;m个0和n个1看作背包的重量&#xff0c;则该…

jenkins +docker+python接口自动化之jenkins容器安装python3(二)

jenkins dockerpython接口自动化之jenkins容器安装python3&#xff08;二&#xff09; 目录&#xff1a;导读 前提是在docker下已经配置好jenkins容器了&#xff0c;是将python安装在jenkins容器下的 1、先看你的jenkins是否安装好 2、以root权限进入jenkins容器&#xff1…

NLP方向的论文可投的核心期刊

目录1、《计算机仿真》北大核心、科技核心2、《通信学报》北大核心、科技核心、CSCD核心3、《计算机科学》北大核心、EI来源期刊、CSCD核心4、《计算机工程》北大核心、科技核心5、《计算机应用》北大核心、科技核心、CSCD核心6、《计算机工程与应用》北大核心、科技核心、CSCD…

Python - 数据容器dict(字典)

目录 字典的定义 字典数据的获取 字典的嵌套 字典的各种操作 新增与更新元素 [Key] Value 删除元素 pop和del 清空字典 clear 获取全部的键 keys 遍历字典 容器通用功能总览 字典的定义 使用{}&#xff0c;不过存储的元素是一个个的&#xff1a;键值对&#…

golang的web框架Gin(一)---Gin的Resutful风格

Restful风格是什么&#xff1f; REST与技术无关&#xff0c;代表的是一种软件架构风格&#xff0c;REST是Representational State Transfer的简称&#xff0c;中文翻译为“表征状态转移”或“表现层状态转化”。 RESTFUL特点包括&#xff1a; 每一个URI代表1种资源&#xff…

STM32F103C8T6—库函数应用I2C/SPI驱动OLED显示中文、字符串

文章目录1. I2C与SPI通信协议对比2. 四脚OLED与六脚OLED3. I2C驱动OLED显示oled.h & oled.c&#xff1a;汉字取模 & oledfont.h&#xff1a;main.c 显示示例&#xff1a;连线方法&#xff1a;4. SPI驱动OLED显示1. I2C与SPI通信协议对比 I2C&#xff08;Inter-Integra…