首页 > 数据库 >mysql面试高频问题---事务-MVCC多版本并发控制(难)

mysql面试高频问题---事务-MVCC多版本并发控制(难)

时间:2024-02-23 15:44:05浏览次数:34  
标签:事务 快照 记录 MVCC undo --- 版本 mysql

MVCC多版本并发控制

1. 问题

锁:排他锁(如一 个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)
mvcc:多版本并发控制
2. MVCC多版本并发控制
MVCC全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

MVCC的具体实现,主要依赖于数据库记录中的隐式字段、undo log日志、readView。

例如:下面有4个事务,事务2、3、4对该记录都进行了操作,那么在事务5中的两条查询语句是查询的哪个事务版本的记录呢?

MVCC的实现原理:

  1. 记录中的隐藏字段

  2. undo log 回滚日志
    a. 回滚日志,在insert、 update、 delete的时候产生的便于数据回滚的日志。
    b. 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除
    c. 而update、delete的时候, 产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除

  3. undo log 版本链
    不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

  4. readview
    ReadView (读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的) id。
    a. 当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:
    select … lock in share mode(共享锁),select … for update、update、 insert、 delete(排他锁)都是一 种当前读。
    b. 快照读:简单的select (不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
    Read Committed:每次select, 都生成一个快照读。
    Repeatable Read:开启事务后第一个select语句才是快照读的地方。

举例说明:

当前读:不受隔离级别影响,事务A的两次select都是读到的最新的数据
快照读:不同的隔离级别不一样,RC读出来不一样,RR读出来都是相同的,获得的结果就是快照读

ReadView包含的四个核心字段:


不同的隔离级别,生成ReadView的时机不同:
➢ READ COMMITTED :在事务中每一 次执行快照读时生成ReadView。
➢ REPEATABLE READ:仅在事务中第一 次执行快照读时生成ReagView,后续复用该ReadView。

3. 总结

4. 问答

标签:事务,快照,记录,MVCC,undo,---,版本,mysql
From: https://www.cnblogs.com/xiaolibiji/p/18029709

相关文章

  • Go 100 mistakes - #62: Starting a goroutine without knowing when to stop it
       ......
  • 数学笔记(1)-勾股定理与勾股数
    勾股定理,是一个基本的几何定理,指直角三角形的两条直角边的平方和等于斜边的平方。中国古代称直角三角形为勾股形,并且直角边中较小者为勾,另一长直角边为股,斜边为弦,所以称这个定理为勾股定理,也有人称商高定理。勾股定理现约有500种证明方法,是数学定理中证明方法最多的定理之一。勾......
  • UtilMeta - 简洁高效的 Python 后端元框架
    最近开源了我开发多年的一个Python后端框架:UtilMeta项目介绍UtilMeta是一个用于开发API服务的后端元框架,基于Python类型注解标准高效构建声明式接口与ORM查询,能够自动解析请求参数与生成OpenAPI文档,高效开发RESTful接口,产出的代码简洁清晰,并且支持使用主流Python......
  • 迅为RK3568开发板驱动开发指南-输入子系统
     《iTOP-RK3568开发板驱动开发指南》更新,本次更新内容对应的是驱动(第十三篇输入子系统)视频,帮助用户快速入门,大大提升研发速度。 第13篇-输入子系统目录第1篇驱动基础篇第2篇字符设备基础第3篇并发与竞争第4篇高级字符设备进阶第5篇中断第6篇平台总线第7篇设备树......
  • three.js-坐标轴辅助器
    坐标轴辅助器(AxesHelper)用于简单模拟3个坐标轴的对象.红色代表X轴.绿色代表Y轴.蓝色代表Z轴.constaxesHelper=newTHREE.AxesHelper(5);scene.add(axesHelper);文档地址:https://threejs.org/docs/index.html#api/zh/helpers/AxesHelper构造函数(Constructor)A......
  • three.js-轨道控制器(OrbitControls)
    轨道控制器(OrbitControls)Orbitcontrols(轨道控制器)可以使得相机围绕目标进行轨道运动。要使用这一功能,就像在/examples(示例)目录中的所有文件一样,您必须在HTML中包含这个文件。进口OrbitControls是一个附加组件,必须显式导入。See Installation/Addons.import{OrbitCont......
  • Linux文本三剑客超详细教程---grep、sed、awk
    Linux文本三剑客超详细教程---grep、sed、awk羽林君 2023-10-1223:51 广东文章来源:https://www.cnblogs.com/along21/p/10366886.html awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相......
  • 02-23整理 MySQL主从库搭建过程
    主从库搭建需要主库从库均有配置,井号#之后部分为注释主库:#创建数据同步用户账号,自行替换变量createuser${slaveuser}@'${ip}'identifiedby'${password}';grantreplicationslaveon*.*to${slaveuser}@'ip';#查看用户被授权限:showgrantsfor${slaveuser}@'ip';......
  • 2024-02-22-物联网系统编程(3-进程)
    3.进程3.1进程概述3.1.1进程的定义程序:存放在存储介质上的可执行文件进程:程序的执行实例,包括程序计数器、寄存器和变量的当前值程序是静态的,进程是动态的。程序是一些执行的有序集合,而进程是程序执行的过程;进程状态是变化的,有创建、调度和消亡。在linux系统中,进程是管理事......
  • MySQL基础语句概括
    1.DDL语句(1)DDL数据库操作SHOWDATABASES;//显示当前数据库列表CREATEDATABASE数据库名;//创建数据库USE数据库名;//转到指定数据库SELECTDATABASE();//返回当前数据库名称(2)DDL表操作SHOWTABLES;CREATETABLE表名(字段......