Mysql MVCC实现

news2024/12/23 11:53:39

文章目录

  • 背景
  • MVCC定义
  • 快照读和当前读
    • 当前读
    • 快照读
  • MVCC实现原理
    • 隐式字段
    • undo log
      • 版本链
        • 1.插入一条记录
        • 2.修改记录
        • 3.修改记录
    • Read View读视图
      • 属性:
      • Read View可见性算法
  • 隔离级别
  • 长事务
    • 为什么要避免长事务

背景

并发事务可能产生的问题:

  • 读+读,并发读不会有问题
  • 读+写,并发读写可能会发生脏读、不可重复读、幻读
  • 写+写,并发修改同一行数据,可能产生数据丢失(会滚丢失、覆盖丢失)等问题

MVCC定义

MVCC(Mutil Version Concurrency Control)多版本并发控制,是一种并发访问的机制(非具体实现),广泛应用于数据库管理系统,比如Mysql、Oracle、Postgresql等,实现对数据库的并发访问。本质就是一行数据具有多个不同版本的记录。

Mysql的InnoDB引擎实现了MVCC机制,用来处理读写冲突,做到非阻塞并发读,提升并发效率。

快照读和当前读

当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁

  • select lock in share mode(共享锁) 读读不冲突、读写、写写冲突
  • select for update ; update, insert ,delete(排他锁) 读读、读写、写写冲突

快照读

顾名思义,就是读取undo log中的某一版本的快照,读到的数据可能不是最新的,但是可以不加锁就可以读到数据

  • 读读不冲突、读写不冲突
  • 写写冲突

MVCC实现原理

MVCC的目的就是多版本并发控制,在数据库的实现,就是为了解决读写冲突,它的实现原理主要依赖记录中的3个隐式字段,undolog,Read View来实现的。

隐式字段

每行记录除了我们自定义的字段之外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段

  • BD_TRX_ID: 6byte,最近修改(修改/插入)的事务ID:记录创建该记录/最后一次修改该记录的事务ID
  • DB_ROLL_PTR: 7byte,回滚指针,指向这条记录的上一个版本(存储在rollback segment里)
  • DB_ROW_ID: 6byte,隐含自增ID,如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引

在这里插入图片描述

undo log

在修改数据的时候,会向 redo log 中记录修改的页内容(为了在数据库宕机重启后恢复对数据库的操作),也会向 undo log记录数据原来的快照(用于回滚事务)。undo log有两个作用,除了用于回滚事务,还用于实现MVCC

  • insert log:代表事务在 insert 新记录时产生的 undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃
  • update undo log:事务在进行 update 或 delete 时产生的 undo log ; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被 purge 线程统一清除

版本链

1.插入一条记录

在这里插入图片描述

2.修改记录

在这里插入图片描述

  1. 加锁
  2. copy到undo log,作为旧记录(当前行的copy副本)
  3. 修改age,trx_id(从1开始递增);回滚指针指向副本
  4. 提交事务,释放锁

3.修改记录

在这里插入图片描述

  1. 加锁
  2. copy到undo log,作为旧记录(当前行的copy副本),已经有undo log,此副本作为链表表头插入的undo log的头节点
  3. 修改age,trx_id(从1开始递增);回滚指针指向副本
  4. 提交事务,释放锁

Read View读视图

Read View是在对数据进行快照读时,会产生的一个”一致性读视图“。

属性:

  • m_ids:活跃事务id列表,当前系统中所有活跃的(也就是没提交的)事务的事务id列表。
  • min_trx_id:m_ids 中最小的事务id。
  • max_trx_id:生成 ReadView 时,系统应该分配给下一个事务的id(注意不是 m_ids 中最大的事务id),也就是m_ids 中的最大事务id + 1 。
  • creator_trx_id:生成该 ReadView 的事务的事务id。

这些属性组成了当前事务的一致性视图(Read View),而数据版本的可见性规则,就是基于数据的 row trx_id 和这个一致性视图的对比结果得到的。

Read View可见性算法

把数据的最新记录中的 DB_TRX_ID取出来,与Read View对比,如果不符合可见性,那就通过undo log 取下一个版本对比,直到找到满足可见性的版本数据。
在这里插入图片描述

  • 当【版本链中记录的 trx_id 等于当前事务id(trx_id = creator_trx_id)】时,说明版本链中的这个版本是当前事务修改的,所以该快照记录对当前事务可见。
  • 当【版本链中记录的 trx_id 小于活跃事务的最小id(trx_id < min_trx_id)】时,说明版本链中的这条记录已经提交了,所以该快照记录对当前事务可见。
  • 当【版本链中记录的 trx_id 大于下一个要分配的事务id(trx_id > max_trx_id)】时,该快照记录对当前事务不可见。
  • 当【版本链中记录的 trx_id 大于等于最小活跃事务id】且【版本链中记录的trx_id小于下一个要分配的事务id】(min_trx_id<= trx_id < max_trx_id)时,
    • 如果trx_id m_ids中,说明生成 ReadView 时,修改记录的事务还没提交,所以该快照记录对当前事务不可见;
    • 如果trx_id不在m_ids中,说明生成该版本的事务已经提交,对当前事务可见

隔离级别

  • 读未提交(READ UNCOMMITTED)
  • 读已提交(READ COMMITTED)
  • 可重复读(REPEATABLE READ)
  • 串行化(SERIALIZABLE)

mvcc只在读已提交和可重复读两种隔离级别生效

  • 读已提交
    • 事务开启后,每次select都会生成一个Read View,可以读到别的事务已经提交的数据
  • 可重复读
    • 事务开启后,只在第一次select时生成Read View,之后的select都基于此视图做可见性判断。

长事务

为什么要避免长事务

  • 长事务可能存在很老的Read View,如下图的事务1和2,这些视图很可能访问任何数据,在这个事务提交前,它可能用到的回滚记录都不能清理,需要保留,占用大量存在空间
  • 长事务占用锁资源,长时间不释放锁,可能拖垮整个库
    在这里插入图片描述

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

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

相关文章

zk111111111111111111

Zookeeper 1 zookeeper(作为 dubbo 的注册中心): 概述: zookeper 是 一个分布式的、开源的分布式应用程序的协调服务,管理分布式应 用 作用: 配置管理,分布式锁,集群管理 2 zookeeper 的安装 (dubbo 的资料中已经整理) 3 zookeeper 的数据模型 zookeeper 是一个树形的服…

微信小程序php+vue 校园租房指南房屋租赁系统

本着诚信的原则&#xff0c;平台必须要掌握出租方必要的真实可信的信息&#xff0c;这样就可以防止欺诈事件的发生&#xff0c;事后也可以联系找到出租方。并且租金等各方面规范标准化&#xff0c;在这易租房诚信可信的平台让承租方与出租方充分有效对接&#xff0c;既方便了承…

扫清盲点:带你学习 树状数组 这种数据结构

什么是树状数组 树状数组是一种用于维护数列前缀和的数据结构&#xff0c;它可以在 O(logn) 的时间复杂度内修改单个元素的值&#xff0c;以及查询某个区间的元素和。 树状数组的特点是什么&#xff1f; 树状数组的特点其实就是&#xff0c;在单点修改 &#xff0c;和区间查询…

rancher2.7丢失集群信息

使用Docker 单节点安装rancher&#xff0c;然后在rancher中创建了一个k8s的集群。重启rancher所在的虚拟机后&#xff0c;登录rancher发现这是新的实例&#xff0c;集群信息丢失了。但是k8s集群还是好好的。 检查k8s的日志&#xff0c;api server日志会报错 time"2023-0…

11 - 多平台适配

多平台适配 11-1&#xff1a;开篇 在上一章中&#xff0c;我们知道了&#xff0c;当【慕课热搜】运行到 h5 端的时候&#xff0c;那么会出现一些问题&#xff0c;这些问题具体有&#xff1a; hot 列表滚动&#xff0c;tabs 置顶效果消失在火狐浏览器中&#xff0c;横线出现非…

kafka-kafka集群配置、kafka集群启动创建kafka主题、获取主题数据

本文章使用三台主机&#xff0c;分别为&#xff1a;master、slave1、slave2 一、解压kafka安装包至目录下 tar -zxvf kafka_2.12-2.4.1.tgz -C /需要放置的路径/ 二、修改配置文件 server.properties 该配置在kafka目录的config目录下 #修改文件中id数值 broker.id0 kafka集群…

Linux -- Web服务器-Apache 快速安装及主配置文件分析

目录 快速安装 Apache : 预处理 &#xff1a; 关闭安全上下文检测 : 关闭防火墙 : 启动 Apache 服务 &#xff08; 启动 httpd &#xff09;: 测试 &#xff1a; 主配置文件分析 &#xff1a; 常见配置文件所在位置 &#xff1a; 目录文件结构 &#xff1a;…

购物车--订单模块,练习完成

目标&#xff1a; 在购物车页面&#xff0c;增加一个创建订单的超链接。通过创建订单&#xff0c;在Order表里新增一条数据&#xff0c;同时把session中的订单条目都保存到数据库中。 1、创建两个表&#xff0c;orders用来具体存储每一个订单的细节&#xff0c;order_用来存储…

基于MobileNetV2的Transfer Learning模型,实现物体检测(附源码)

文章目录 一、MobileNet1. 深度可分离卷积&#xff08;Depthwise separable convolution&#xff09;2. MobileNet V13. MobileNet V2 二、物体检测源码&#xff08;基于MobileNetV2&#xff09; 一、MobileNet 1. 深度可分离卷积&#xff08;Depthwise separable convolution…

智慧园区综合管理平台开发基本功能有哪些?

随着智慧城市建设与信息化发展&#xff0c;园区管理也需要更加智能便捷化&#xff0c;于是智慧园区管理系统开发应运而生。智慧园区综合管理系统就是利用物联网、大数据等技术工具&#xff0c;顺应产业园区升级发展需求&#xff0c;实现园区环境、设备、安全、基础管理、资源服…

【Linux】进程间通信——命名管道

文章目录 命名管道1. 见一见管道文件mkfifo函数管道文件的使用 2. 命名管道原理如何保证两个毫不相关的进程&#xff0c;看到的是同一个文件&#xff0c;并打开&#xff1f; 3. 用命名管道实现server&client通信如何使用makefile连续生成可执行程序comm.hpp文件server.cc 服…

如何通过 Baklib 平台实现知识共享(内含案例介绍)

在这个信息时代&#xff0c;知识被认为是最重要的资源之一。企业要想保持发展&#xff0c;就必须善于利用和管理知识。而知识管理则是一种涵盖人、过程和技术的活动&#xff0c;它通过收集、整理、传递和应用知识&#xff0c;使组织获得更高的效率、创造力和竞争力。本文将以知…

【Linux】八、Linux进程信号详解(一)

目录 一、认识信号 1.1 生活中的信号 1.2 将1.1的概念迁移到进程 1.3 信号概念 1.4 查看系统定义信号列表 1.5 man 7 signal 1.6 解释1.2的代码样例 1.7 信号处理常见方式概览 二、产生信号 2.1 signal函数 2.2 通过终端按键产生信号 2.3 调用系统函数向进程发信号…

前后端的身份认证【Node.js】

1. 前后端的身份认证 1.1 Web 开发模式 目前主流的 Web 开发模式有两种&#xff0c;分别是&#xff1a; &#xff08;1&#xff09;基于服务端渲染的传统 Web 开发模式 &#xff08;2&#xff09;基于前后端分离的新型 Web 开发模式 服务端渲染的传统 Web 开发模式 服务端渲染…

力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现

文章目录 第一部分&#xff1a;问题描述1.1 题目1.2 示例&#x1f340; 示例一&#x1f340; 示例二 1.3 提示 第二部分&#xff1a;思路分析第三部分&#xff1a;代码实现 第一部分&#xff1a;问题描述 1.1 题目 &#x1f3e0; 链接&#xff1a;面试题 08.06. 汉诺塔问题 -…

windows安装rabbitmq和环境erlang(最详细版,包括对应关系)

写在最前&#xff1a;不知何时起安装一个mq需要翻无数文章才能安上了&#xff0c;没有一个讲全的&#xff0c;这里写一个详细的教程。 删除旧版本对应关系: 1.在官方文档中找到RabbitMQ版本对应的Erlang版本重新下载安装包文档RabbitMQ Erlang Version Requirements — Rabbit…

大家副业都在做什么?csgo搬砖靠谱的副业推荐给你

从来没想过&#xff0c;以前只会玩CSGO的男孩子&#xff0c;现在居然能借助游戏赚到钱了&#xff01;甚至不需要什么专业的技巧&#xff0c;简简单单 在steam平台选择有利润的道具后&#xff0c;再上架到国内网易BUFF平台&#xff0c;赚取“信息差”差价而已&#xff01; 谁大…

itop-3568开发板驱动学习笔记(19)内核工作队列

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 工作队列简介共享工作队列工作结构体初始化 work_struct调度工作队列函数共享工作队列实验 自定义工作队列创建工作队列函数调度和取消调度工作队列刷新工作队列函数删除工作队列函数 内核延时工作队列延时…

成功上岸字节35K,技术4面+HR面,耗时20天,真是不容易

这次字节的面试&#xff0c;给我的感触很深&#xff0c;意识到基础的重要性。一共经历了五轮面试&#xff1a;技术4面&#xff0b;HR面。 下面看正文 本人自动专业毕业&#xff0c;压抑了五个多月&#xff0c;终于鼓起勇气&#xff0c;去字节面试&#xff0c;下面是我的面试过…

kali利用airgeddon破解WiFi (详细安装和使用教程)

目录 前言 一&#xff0c;软件&硬件环境 二&#xff0c;前期配置 Airgeddon安装和调试 #自带 #安装方法一 #安装方法二 #注意 网卡的配置 #打开服务 #加载网卡 三&#xff0c;运行操作 #检查 #主菜单 #打开监听模式 #查看周围可以攻击的网络 #截取…