首页 > 数据库 >MySQL中的MVCC

MySQL中的MVCC

时间:2024-03-25 11:33:05浏览次数:21  
标签:事务 log MVCC 提交 MySQL 数据 隔离

MySQL中的MVCC

作用

MVCC在MySQL中主要用于解决事务的隔离性, 具体来说, 不同的事务在同一时间点可以看到数据库不同的时间点快照, 而不会被其他事务的修改所影响, 主要是为了减少锁的使用, 提升系统的并发能力.

实现

  1. TxID​: 事务的ID, 一个递增的值, 值越大表示发生的时间越短.

  2. LastPtr​: 指向之前的版本

  3. ReadView​: 对于一个事务的一个操作而言, 一个ReadView​包含以下部分: CurrentTxId, RunningTX, MaxTX

    • CurrentTxId: 表示当前的事务的ID
    • RunningTX: 表示当前同时执行的事务ID
    • MaxTX: MAX(RunningTX)

​ReadView​

事务执行的某一步, 此时获取到了Record, 存在以下可能性

  • Record.TxID <= CurrentID, 表示是在自己前的事务生成的, 数据一定可见

  • Record.TxID >= MaxTX, 表示是将来可能执行的事务, 数据一定不可见: Record = Record.LastPtr

  • min(RunningTX) <= Record.TxID < MaxTX, 这部分稍微讨论下

    a. 如果TxID IN​ RunningTX中, 表示这个事务由未提交事务生成, 不可见

    b. 如果TxID NOT IN​RunningTX中, 表示这个事务由已提交事务生成, 可见

MVCC与隔离级别的关系

隔离级别

隔离级别

  1. 读未提交: 还没提交时, 更改就会影响到其他的事务

    效果最差, 事务A开启后, 做修改, 其他事务可以读到A的修改, 导致判断失误.

    读操作 + lock in share mode;

  2. 读提交: 提交之后, 其他事务才能看到更改

    总是获取最新的commited的日志

    只有在A提交之后, B才能查到最新的数据.

    所以多个事务完成后, 可能导致B查询的数据是变化的,

    所以读提交, 是不可以重复读的.

  3. 可重复读: 一个事务在执行过程中, 总是跟这个事务启动时看到的数据是一致的

    指向事务开始时的commited的日志

    B读取的数据总是和自己启动时的数据是一致的

    解决方案

    • 乐观锁

      新添加一个字段version

      version 和 查询数据保存在一起

      如果版本不一致, 等待重试.

    • 悲观锁

      对行加锁

      update Table SET a = a + 1 where b =1;

      这时候不会再读版本数据, 会使用最新的数据.

  4. 串行: 无冲突

    完全无冲突, 效率极差, 对并发事务支持非常差

从这个角度我们来看事务隔离级别会有一些不同的感受

  1. 读未提交, 不创建ReadView, 直接读取当前行的当前版本数据, 不考虑任何版本相关信息.
  2. 读提交, 在每个语句执行时, 都创建一个ReadView, 总是能够获取到最新的已提交数据.
  3. 可重复读, 只使用事务开始时创建的ReadView

MVCC与Undo-log的关系

Undo log

和实际操作相反的操作

如果insert, 写入delete

如果update, 写入rollback

如果delete, 写入update(delete 是一种特殊的update, 会将行标记为删除, 实际上是一种update)

为了保证事务的原子性和持久性 ACID: 原子性, 一致性, 隔离性, 持久性

如果事务全部成功, undo log为了保证数据成功会将备份数据页覆盖掉

如果事务有失败, 导致事务回滚, 那么会从undo log中取出备份数据页并且写回

因为事务的执行是线性的, 所以undo log 的写入在正常执行的时候也是线性的

而且undo log是写入文件的, 在掉电之后, 可以通过undo log复原事务前的数据, 保证数据的持久性

  • 数据一致性:MVCC允许多个事务看到同一数据的不同版本。Undo Log中保存的数据版本是实现这种多版本数据一致性的关键。
  • 回滚操作:当一个事务需要回滚时,MVCC需要确保所有数据可以回到事务开始之前的状态。Undo Log记录了足够的信息来撤销一个事务所做的改变。
  • 事务隔离级别:不同的隔离级别对应于不同的一致性需求。MVCC通过Undo Log提供的历史数据版本来实现这些隔离级别,比如可重复读(REPEATABLE READ)和读已提交(READ COMMITTED)。

标签:事务,log,MVCC,提交,MySQL,数据,隔离
From: https://www.cnblogs.com/pDJJq/p/18094037/mvcc-in-mysql-ycs3m

相关文章

  • 用生动的语言讲mysql索引机制与B+树形象化理解
    索引,index,是什么呢,假如说,没有索引,比如你要点名,你就得挨个问,你是不是某某某,效率奇低,但是,当他们有了独一无二的号数或者名字,就可以免于追寻,一觅即中,这就是索引存在的意义但是,凡事有利有弊,索引增加了查询的效率,但是却降低了增删改的效率,比如说,班级加入一名新同学,你还要给他一个号数,......
  • djangoCIA报价平台的设计与实现(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,互联网已经深入到我们日常生活的方方面面。在众多的应用场景中,报价系统作为商业交易的重要环节,扮演着至关重要的角色。尤其是在CIA(Ce......
  • djangoAndroid共享停车位(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加速,汽车已成为人们日常生活中不可或缺的交通工具。然而,在许多城市中,由于停车位数量有限,停车难成为了一大问题。为了解决这一问题,共享停车......
  • cmd窗口远程连接mysql数据库命令
    注意点:电脑需要先安装好mysql数据库(不等同于安装好Navicat工具,是要安装好MySQL数据库)1、同时点击win+R,输入cmd之后点击回车,进入cmd窗口;2、直接在命令行中输入mysql-h数据库ip地址-P端口号-u用户名-p比如:mysql-h192.168.5.116-P3306-uroot-p3、点击回车,会出......
  • 【附源码】django计算机毕业设计web的诗词信息管理平台(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化时代,诗词作为中华民族传统文化的瑰宝,承载着丰富的历史和文化价值。然而,随着科技的发展和生活节奏的加快,人们对于诗词的接触和传承逐渐减少,尤其......
  • 【附源码】django计算机毕业设计web技术的养老服务平台(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义养老服务平台开发设计背景:随着社会老龄化的加剧,养老问题逐渐成为社会关注的热点。老年人作为社会的重要组成部分,他们的生活质量和幸福感直接关系到社会的和谐与稳定......
  • 基于springboot+vue+Mysql的留守儿童爱心网站
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示系统首页界面宣传新闻界面志愿活动界面爱心捐赠界面个人中心界面用户注册界面管理员登录界面......
  • MySQL索引介绍
    MySQL索引介绍01MySQL的索引是什么?在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。我们都知道,MySQL需要支持持久化,它把数据存储......
  • MySQL
    MySQL讲讲mysql的索引为什么要用B+树?B+树为什么更矮胖?有序性:B+树是一种有序的树形结构,可以快速定位和范围查询数据。在B+树中,所有的叶子节点都按照键值的大小顺序连接在一起,这使得范围查询变得高效。同时,有序性也使得B+树在范围查询、排序和分组等操作上更加高效。平衡性:B......
  • 第十篇:MySQL内置函数(字符串函数|数值函数|日期函数|流程函数)
    函数就是一段写好的、具有特定功能的代码,可以被另一段程序直接调用,只要拥有编程基础。想必对函数并不陌生本篇将系统性地记录MySQL中常用的内置函数,主要分为这四大类,字符串函数数值函数日期函数流程函数一,字符串函数(一)concat(S1,S2,...Sn)<-拼接作用描述将传入......