首页 > 数据库 >MySQL MVCC实现原理

MySQL MVCC实现原理

时间:2024-07-08 17:11:38浏览次数:18  
标签:事务 读取 Read MVCC InnoDB 版本 MySQL 原理 View

  MySQL的InnoDB存储引擎使用多版本并发控制(MVCC,Multi-Version Concurrency Control)机制来支持高并发的读写操作,同时保证事务的隔离性和一致性。MVCC允许不同的事务看到不同的数据版本,从而减少了锁的竞争,提高了数据库的并发性能。

隐式字段

InnoDB在每行记录中添加了几个隐藏的列,包括:

  • DB_TRX_ID:记录最后一次修改该行的事务ID。
  • DB_ROLL_PTR:指向undo log的指针,用于回滚操作。
  • DB_ROW_ID:行的内部ID,用于辅助排序和查找。

版本链

每当一行数据被更新时,InnoDB并不会直接修改该行,而是生成一个新的行版本,并且保留旧的行版本。这样,不同的事务就可以看到不同时间点的数据版本。

Read View

Read View是事务可见性的关键概念。当一个事务开始时,它会创建一个Read View,这个Read View包含了当前活跃事务的列表。Read View用于判断某一行是否对当前事务可见。只有那些在Read View创建之前就已经提交的事务所修改的行才会对当前事务可见。

快照读和当前读

  • 快照读(Snapshot Read):快照读是非锁定读取,即SELECT查询默认的行为。它读取的是最新的可读版本,不会阻塞其他事务对同一行的读写操作。
  • 当前读(Current Read):当前读是指锁定读取,通常发生在使用FOR UPDATELOCK IN SHARE MODE时。它会读取行的最新版本,并可能产生行级锁。

隔离级别

  • 读已提交(Read Committed):在这个隔离级别下,每次读操作都会看到最新的提交版本,这意味着事务间的可串行化程度较低,但并发度较高。
  • 可重复读(Repeatable Read):在这个隔离级别下,一旦事务读取了某行数据,即使有其他事务更新了该行,当前事务再次读取时仍会看到第一次读取时的版本,因此可以重复读取相同的数据版本。

实现流程

  • 对于快照读,InnoDB会检查行的版本是否比当前事务的Read View早,如果是,则行可见;否则,行不可见。
  • 对于当前读,InnoDB会直接读取行的最新版本,并可能产生锁。

通过上述机制,InnoDB能够有效地处理并发读写操作,同时保证了事务的ACID属性。

需要注意的是,虽然MVCC提高了并发性能,但它也增加了存储空间的消耗,因为需要存储多个版本的数据,并且在某些情况下可能导致幻读(Phantom Reads)。此外,MVCC的实现也会增加一些额外的计算开销,尤其是在需要进行版本比较和Read View维护时。

标签:事务,读取,Read,MVCC,InnoDB,版本,MySQL,原理,View
From: https://www.cnblogs.com/use-D/p/18290330

相关文章

  • Mysql中索引的分类、增删改查与存储引擎对应关系
    场景Mysql中存储引擎简介、修改、查询、选择:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140269624上面介绍Mysql的存储引擎。下面介绍索引的分类和使用。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现Mysql中索引的分类1、普通索引和唯一索引......
  • spring三级缓存解决循环依赖原理
    在Spring框架中,Bean的实例化和管理是通过其核心的IoC容器完成的。在处理Bean的依赖注入时,可能会遇到循环依赖的问题,即两个或多个Bean相互引用对方。为了解决这一问题,Spring采用了三级缓存机制。一级缓存:singletonObjects这是SpringIoC容器中的主要缓存,用于存放已经创建并完全初......
  • MYSQL常用SQL语句
    数据库概述1、什么是数据库管理系统?数据管理系统是一种在数据库中组织和存储数据的软件应用程序。常见的数据库管理系统分为两大类:关系型数据管理系统和非关系型管理系统关系型数据库:MySQL、Oracle、SQLServer、Access非关系型数据库:MongoDB2、什么是数据库?数据库(Databas......
  • 【0295】Posgres内核 dynahash table 之 hash_search 实现原理(2)
    相关文章:【0294】Postgres内核dynahash之hash_search实现原理(1)0.前言在【0294】Postgres内核dynahash之hash_search实现原理(1)一文中,从Postgres内核源码角度详细讲解了dynamichashtable中hashsearch的实现原理。具体内容:如何确定segment位置如何确定bu......
  • Mysql中存储引擎简介、修改、查询、选择
    场景数据库存储引擎数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据的操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。现在许多数据库管理系统支持多种数据引......
  • 08.以太网交换基础+VLAN原理
    一、以太网协议介绍冲突域在共享网络(集线器hub)中,整个集线器就是一个冲突域,如果你用我也用那就信号冲突,结果全军覆没,什么数据都无法传输。为此引入了CSMA/CD机制,这样就能有效避免冲突。终端设备不停地检测共享线路的状态-->如果线路空闲,会有一个随机延迟,然后开始发送......
  • Docker部署Django+MySQL+Redis+Nginx+uWSGI+Celery(超详细)
    一、知识储备经过我们之前学习的Docker相关知识,现在我们来进行实战,以下介绍如何通过DockerCompose部署Django项目:先前知识:Docker学习笔记(一)概念理解-CSDN博客Docker学习笔记(二)镜像、容器、仓库相关命令操作-CSDN博客Docker学习笔记(三)Dockerfile-CSDN博客DockerCompose......
  • nginx作为反向代理服务器:代理MySQL、Postgresql、Redis及多个TCP服务
    使用Nginx作为反向代理服务器,可以代理MySQL、PostgreSQL、Redis及多个TCP服务。这需要配置Nginx的stream模块。以下是详细的配置步骤:1.确保Nginx支持stream模块首先,确保Nginx已经编译并支持stream模块。运行以下命令检查:nginx-V在输出中查找--with-str......
  • [NodeJS] NodeJS运行原理简记
    NodeJS的基本组成NodeJS是JavaScript运行时,主要由V8引擎和libuv组成,其中V8使用javascript和c++编写,而libuv是纯c++编写的,二者都是开源的。V8引擎用于将javascript代码转换为计算机可以执行的机器码;而libuv则负责完成异步IO、与操作系统交互(文件系统和网络模块)、事件循......
  • springboot在线商城系统源码idea开发mysql数据库
    下载地址:https://download.csdn.net/download/qq_41221322/89519994摘要近年来,网上购物成了风靡全球的一种现象,大家逐渐接受了网上下单,隔天取货的这种方式。我们分析了一些购物网站现有的不足,结合我们所学的知识,制作了一款购物网站程序。学以致用,语言采用了大学时期学习的J......