mysql5.7系列-InnoDB的MVCC实现原理

谈到数据库事务都要提一下ACID 特性:

原子性(Atomicity):事务中的操作要么全部执行,要么全部不执行。

一致性(Consistency):事务执行前后,数据库的状态必须是一致的。

隔离性(Isolation):一个事务的执行不应受其他事务的干扰,每个事务都应有自己的数据视图。

持久性(Durability):一旦事务提交,其结果就会永久保存。

什么是mvcc

mvcc全称Multi-Version Concurrency Control ,多版本并发控制,顾名思义是维持了数据库中数据的多版本;这个机制主要是为了服务事务隔离级别中的READ COMMITTED和REPATEABLE READ两种隔离级别在多个事务读取数据的时候能遵守sql标准。

本质:就是通过Read View + Undo Log来实现的,Undo Log中保存了历史快照,而Read View 用来判断具体哪一个快照是可见的。

下面具体介绍下,什么是 Undo Log和Read View:

什么是Undo Log

undo log是innodb引擎的一种日志,在事务的修改记录之前,会把该记录的原值(before image)先保存起来(undo log)再做修改,以便修改过程中出错能够恢复原值或者其他的事务读取。

数据库中的每行记录中,除了保存了我们自己定义的一些字段以外,还有一些重要的隐式字段的:

● db_row_id:隐藏主键,如果我们没有给这个表创建主键,那么会以这个字段来创建聚簇索引。

● db_trx_id:对这条记录做了最新一次修改的事务的ID

● db_roll_ptr:回滚指针,指向这条记录的上一个版本,其实他指向的就是Undo Log中的上一个版本的快照的地址。

因为每一次记录变更之前都会先存储一份快照到undo log中,那么这几个隐式字段也会跟着记录一起保存在undo log中,就这样,每一个快照中都有一个db_trx_id字段表示了对这个记录做了最新一次修改的事务的ID ,以及一个db_roll_ptr字段指向了上一个快照的地址。这样就产生了一个版本快照链,如下:

什么是Read View

在 RC或者RR事务隔离级别下,当前事务产生select查询时就会产生read view, RC是每次select都会产生一个read view, RR是只在第一次select的时候产生一个read view 后面的select都是使用这个read view

ReadView 中主要包含4个比较重要的内容:

  • m_ids :表示在生成ReadView 时当前系统中活跃的读写事务的事务id 列表。
  • min_trx_id :表示在生成ReadView 时当前系统中活跃的读写事务中最小的事务id ,也就是m_ids 中的最小值。
  • max_trx_id :表示生成ReadView 时系统中应该分配给下一个事务的id 值。

小贴士: 注意max_trx_id并不是m_ids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的事务提交了。那么一个新的读事务在生成ReadView时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。

  • creator_trx_id :表示生成该ReadView 的事务的事务id 。小贴士: 我们前边说过,只有在对表中的记录做改动时(执行INSERT、DELETE、UPDATE这些语句时)才会为事务分配事务id,否则在一个只读事务中的事务id值都默认为0。

而判断数据记录可见性的逻辑就是通过readview和【行记录的隐藏字段trx_id】做对比的

一个事务去访问记录的时候,怎么判断记录的可见性呢?

Read View决定当前事务能读到哪个版本的数据,从表记录到Undo Log历史数据的版本链,依次匹配,满足哪个版本的匹配规则,就能读到哪个版本的数据,一旦匹配成功就不再往下匹配。

遵循了以下可见性匹配规则:

规则说明:

  • trx_id = creator_trx_id:如果 trx_id 值等于创建Read View的事务Id,那么数据记录的最后一次操作的事务就是当前事务,该版本的记录对当前事务可见
  • trx_id < min_trx_id:如果 trx_id 值小于 Read View 中的 min_trx_id ,表示这个版本的记录是在创建 Read View 已经提交的事务生成的,所以该版本的记录对当前事务可见
  • trx_id >= max_trx_id:如果trx_id 值小于 Read View 中的 min_trx_id ,表示这个版本的记录是在创建 Read View 才启动的事务生成的,所以该版本的记录对当前事务不可见
  • min_trx_id <= trx_id < max_trx*id:判断 *trx_id 是不是在当前事务ID集合(m_ids)里面
  • 如果在m_ids中,则代表Read View生成时刻,这个事务还在活跃,还没有Commit,版本记录在前事务不可见
  • 如果不在m_ids中,则说明,这个事务在Read View生成之前就已经Commit了,版本记录在前事务可见

mvcc有什么作用

1.解决脏读问题:一个事务中的每一次SELECT都会重新获取一次Read View。

2.解决不可重复读问题:一个事务中只在第一次SELECT的时候会获取一次Read View。

3.解决部分幻读问题:mvcc+间隙锁可以解决部分幻读问题,但是不能完全解决。

参考资料

https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html

https://www.cnblogs.com/ykmStudy/p/17765346.html

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

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

相关文章

力扣-287.寻找重复数

题目链接 287.寻找重复数 class Solution {public int findDuplicate(int[] nums) {int low nums[0];int fast nums[nums[0]];//1.快慢指针找相遇点while (low ! fast) {low nums[low];fast nums[nums[fast]];}//2.双指针找入环点int pre 0;while (pre ! low) {pre num…

Java 大视界 -- Java 大数据在智能教育个性化学习计划制定与动态调整中的应用(338)

Java 大视界 -- Java 大数据在智能教育个性化学习计划制定与动态调整中的应用&#xff08;338&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 构建的学习行为数据采集与分析体系1.1 全场景数据接入引擎1.2 家校协同数据交互模块1.3 学习特征提取与建模 二、Java 驱动的…

uniapp返回webview返回小程序并且跳转回webview

webview页面提示&#xff1a;wx一定要导入sdk// 返回小程序&#xff0c;并携带当前 WebView 的 URL 和状态wx.miniProgram.postMessage({type: requestPayment,data: {webviewUrl: window.location.href,orderNum: this.orderNum,type: requestPayment}})setTimeout(() > {w…

[java: Cleaner]-一文述之

Cleaner Cleaner 是 Java 9 引入的资源清理机制&#xff0c;用于在对象被垃圾回收后自动或手动执行清理操作&#xff0c;替代 finalize()&#xff0c;安全、异步且高效。 public final class Cleaner {final CleanerImpl impl;static {CleanerImpl.setCleanerImplAccess(new Fu…

知识库中如何确实嵌入文本块大小?语义完整性与检索颗粒度的平衡机制

一、文本块大小确定的理论基础与历史演进 1.1 概念起源与发展脉络 文本块&#xff08;Text Chunk&#xff09; 这一概念最初源于信息检索领域的实践需求。早期的全文检索系统面临着一个根本性矛盾&#xff1a;如何在保持文档语义完整性的同时&#xff0c;实现高效的信息定位。这…

C/C++ 实现在快速排序Quick Sort中的三种分区方式

1. 简介神说, 要有光. 于是就有了光. 神说要有快排, 于是就有了快排. 快速排序Quick Sort的发明者 托尼 霍尔 是1980年的图灵奖得主. 快速排序就是他发明的. 当时发明的背景是: 由于霍尔要高效地对俄语词汇进行排序以优化翻译程序, 而当时的排序算法(如冒泡, 插入排序)效率较低…

Flink TiDB CDC 环境配置与验证

一、TiDB 数据库核心配置 1. 启用 TiCDC 服务 确保 TiDB 集群已部署 TiCDC 组件&#xff08;版本需兼容 Flink CDC 3.0.1&#xff09;&#xff0c;并启动同步服务&#xff1a; # 示例&#xff1a;启动 TiCDC 捕获 changefeed cdc cli changefeed create \--pd"localhos…

2025年数据挖掘与计算机科学国际会议 (DMCS 2025)

2025 International Conference on Data Mining and Computer Science【一】、大会信息 会议简称&#xff1a;DMCS 2025 大会地点&#xff1a;中国广州 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等【二】会议简介2025年数…

腾讯轻量云和云服务器的区别

从问题本身来看&#xff0c;用户应该对云计算有基本了解&#xff0c;但可能不太清楚腾讯云产品线的细分定位。这类问题通常出现在项目初期技术选型阶段&#xff0c;用户需要权衡成本和性能。 让我先梳理两者的核心差异点。轻量云本质是面向轻量级应用的打包解决方案&#xff0c…

在使用ffmpeg时遇到了复制路径在终端输入指令后,报错的解决方法

错误如下所示&#xff1a;解决方法&#xff1a;​​检查路径中的特殊字符​​&#xff1a;你的路径中包含了一个不可见的Unicode字符&#xff08;‪&#xff0c;即LEFT-TO-RIGHT MARK&#xff09;&#xff0c;这是从网页复制路径时常见的隐藏字符​​解决方案​​&#xff1a;直…

高频变压器材料新解:纳米晶的涡流损耗逆袭之路

通过带材做薄纳米晶&#xff0c;可以降低涡流损耗。原因有二&#xff1a;一、纳米晶做薄可以减小磁场的趋肤效应&#xff1b;二、纳米晶越薄材料电阻越高&#xff0c;整体电阻越大&#xff0c;涡流损耗越小。本篇&#xff0c;就来详细谈谈变压器的涡流损耗。 铁氧体材料成本低&…

DMA技术与音频数据的存储和播放

基本概念 采样率: 每秒采集的采样点次数。如480000HZ, 就是我们常见的48KHZ采样点(Sample):每一个采样点代表一个时间点的声音幅度值。对于立体声,每个采样点包含了两个声道(左声道,右声道)的数据。帧:一帧就是一个时刻采集的数据,如果音频是立体声则会产生2个采样点,如…

项目进度受外包团队影响,如何管控交付节奏

项目进度受外包团队影响时&#xff0c;管控交付节奏的关键措施包括明确交付标准与节点、建立可视化进度监控机制、强化合同约束与激励条款、保持高频沟通与快速响应机制、建立联合质量审查机制。其中&#xff0c;明确交付标准与节点最为关键。通过制定具体、可量化的交付标准与…

BM9 删除链表的倒数第n个节点

目录 题目链接 题目 解题思路 代码 题目链接 删除链表的倒数第n个节点_牛客题霸_牛客网 题目 解题思路 先利用快慢指针找到删除位置的前一个节点,然后进行删除即可(具体就是快指针先移动n1个,因为要找到删除指针的前一个节点) 代码 import java.util.*;/** public clas…

java中ehcache因为可以缓存到本地,假如生产环境使用ehcache是不是需要在生产环境服务器创建缓存文件夹目录以存储ehcache缓存的数据

是的&#xff0c;当在生产环境中使用 Ehcache 的磁盘持久化功能时&#xff0c;确实需要在服务器上创建相应的缓存文件夹目录&#xff0c;并确保应用程序有权限读写该目录。 以下是详细说明和配置建议&#xff1a;1. 为什么需要创建缓存目录&#xff1f;Ehcache 的磁盘持久化功能…

day55

1. 序列预测介绍序列预测就是根据过去的序列数据&#xff08;比如时间顺序的数据&#xff09;&#xff0c;预测未来的结果。• 单步预测&#xff1a;只预测下一个时刻的值。比如根据前7天的气温&#xff0c;只预测第8天的气温。• 多步预测的2种方式&#xff1a;◦ 递归式&…

javaweb———html

我才开始学javaweb&#xff08;重点不在这&#xff09;可能学的比较慢&#xff0c;勿说HTML 基础结构HTML 文档的基本结构包含 <!DOCTYPE html> 声明、<html> 根元素、<head> 头部和 <body> 主体部分。<head> 中包含页面元信息&#xff0c;如标题…

OpenCV在Visual Studio 2022下的配置

OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;广泛应用于图像处理、目标检测、模式识别等领域。它通常搭配在Visual Studio集成开发环境中使用&#xff0c;配置步骤主要有下载安装、加入系统环境变量、设置VS项目属性等。 1. 下载安装 a) 进入OpenCV官网&#xf…

kafka如何让消息均匀的写入到每个partition

在Kafka中,要实现消息均匀写入每个partition,核心是通过合理的分区分配策略让消息在partition间均衡分布。具体机制和实践方式如下: 一、Kafka默认的分区分配逻辑(核心机制) Kafka生产者发送消息时,通过Partitioner接口(默认实现为DefaultPartitioner)决定消息写入哪…

centos7修改yum源并安装Ansible

1、修改yum源在 CentOS 系统中&#xff0c;将默认的 yum 源修改为阿里云的镜像源&#xff0c;可以加快软件包的下载速度。以下是详细步骤&#xff1a;1&#xff09;备份原有的 yum 源配置sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2…