技术干货 | 图文结合带你搞懂InnoDB MVCC机制!

Bochs源码分析 - 26:8259中断控制器介绍 前言 现在我们跟着《x86/x64体系探索及编程》来分析17章内容 -- 8259中断控制器。这个是涉及硬件的,很遗憾,除了大学期间使用STM32搞过一个计算器,其余就没多少硬件编程经验,我在淘宝上找了下大概是这个东东。 https://pdos.csail.mit.edu/6.828/2010/readings/hardware/8259A.pdf 上面是8259A的芯片手册,里面讲的还是挺详细的,虽然里面很多东西还是看不太懂,但是结合着《x86/... 阅读详情
  • 前情提要

    • 当前读

    • 快照读

  • 什么是MVCC

    • 三个隐藏字段

    • Undo Log回滚日志

    • MVCC版本链

    • ReadView读视图

  • 不同隔离级别下MVCC分析

    • READ-COMMITTED隔离级别

    • REPEATABLE-READ隔离级别


前情提要

事务有四大特性ACID分别是:原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)

其中隔离性是通过数据库的加上MVCC(多版本并发控制)来保证的。

在介绍MVCC之前先来了解一下当前读和快照读。

当前读

当前读读取的是记录的最新版本。同时在读取的时候还要保证其他的并发事务不能更改当前记录,那么当前读会对它要读取的记录进行加锁。不同的操作会加上不同类型的锁,如:SELECT ... LOCK IN SHARE MODE(共享锁)SELECT ... FOR UPDATE、UPDATE、INSERT、 DELETE(排他锁)

快照读

简单的不加锁的SELECT就是快照读,快照读读取的是快照生成时的数据,不一定是最新的数据,它是不加锁的非阻塞读。而不同隔离级别下,创建快照的时机也不同:

  • READ-COMMITTED(读已提交):事务每次SELECT时创建ReadView

  • REPEATABLE-READ(可重复读):事务第一次SELECT时创建ReadView,后续一直使用

在MySQL默认隔离级别(REPEATABLE-READ)下,快照读保证了数据的可重复读。

什么是MVCC

MVCC全称Multi-Version Concurrency Control,即多版本并发控制。它是一种并发控制的方法,它可以维护一个数据的多个版本,用更好的方式去处理读写冲突,做到即使有读写冲突也能不加锁。MySQL中MVCC的具体实现,还需要依赖于表中的三个隐藏字段Undo Log日志以及ReadView

三个隐藏字段

mysql> SHOW CREATE TABLE stu \G;
*************************** 1. row ***************************
       Table: stu
Create Table: CREATE TABLE `stu` (
  `id` int NOT NULL,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> SELECT * FROM stu;
+----+--------+
| id | name   |
+----+--------+
|  1 |   b    |
|  2 |   f    |
+----+--------+

当创建了上述这张表后,我们在查看表结构时只能看到id、name字段,实际上除了这两个字段外,InnoDB引擎还自动为我们添加了三个隐藏字段,见下表:

字段含义
DB_TRX_ID最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。
DB_ROLL_PTR回滚指针,指向这条记录的上一个版本,用于配合Undo Log,指向上一个版本。
DB_ROW_ID隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

我们可以使用ibd2sdi工具来从表空间文件中提取序列化的字典信息(SDI),来验证一下这三个隐藏字段是否存在。

["ibd2sdi"
,
{
 "type": 1,
 "id": 402,
 "object":
  {
    "mysqld_version_id": 80025,
    "dd_version": 80023,
    "sdi_version": 80019,
    "dd_object_type": "Table",
    "dd_object": {
        "name": "stu",
        "mysql_version_id": 80025,
        "created": 20220919023413,
        "last_altered": 20220919023413,
        "hidden": 1,
        "options": "avg_row_length=0;encrypt_type=N;explicit_encryption=0;key_block_size=0;keys_disabled=0;pack_record=1;stats_auto_recalc=0;stats_sample_pages=0;",
        "columns": [
            {
                "name": "id",
                "type": 4,
                "is_nullable": false,
                "is_zerofill": false,
                "is_unsigned": false,
                "is_auto_increment": false,
                "is_virtual": false,
                "hidden": 1,
···省略
            },
            {
                "name": "name",
                "type": 16,
                "is_nullable": false,
                "is_zerofill": false,
                "is_unsigned": false,
                "is_auto_increment": false,
                "is_virtual": false,
                "hidden": 1,
···省略
            },
            {
                "name": "DB_TRX_ID", #最近修改事务ID
                "type": 10,
                "is_nullable": false,
                "is_zerofill": false,
                "is_unsigned": false,
                "is_auto_increment": false,
                "is_virtual": false,
                "hidden": 2,
···省略
            },
            {
                "name": "DB_ROLL_PTR", #回滚指针
                "type": 9,
                "is_nullable": false,
                "is_zerofill": false,
                "is_unsigned": false,
                "is_auto_increment": false,
                "is_virtual": false,
                "hidden": 2,
···省略
            }
        ],

注意:因为这张表里已经指定了主键为id列,所以不会生成隐藏主键DB_ROW_ID列。

Undo Log回滚日志

回滚日志,在增、改、删操作的时候产生的便于数据回滚的日志。当INSERT操作的时候,产生的回滚日志在事务提交后可被立即删除。而UPDATEDELETE操作的时候,产生的Undo Log日志不仅在进行数据回滚时需要,在进行快照读时也需要,所以不会立即被删除

Undo Log详情可见文章:图文结合带你搞定MySQL日志之Undo log(回滚日志)

MVCC版本链

当有多个并发事务操作一行数据时,对这行数据的修改会产生多个版本,多个版本通过上述的一个隐藏字段DB_ROLL_PTR回滚指针指向Undo Log数据地址形成一个链表,即MVCC版本链

ReadView读视图

ReadView读视图是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

上面讲过Undo Log和MVCC版本链,一条数据经过多次修改会产生多个版本,而快照读是根据不同时机创建的快照获取数据的,那么快照读SQL在执行时该读取那个版本的数据就是靠ReadViw读视图来决定的。

ReadView读视图中包含了四个核心字段,也是读取数据的判断依据:

字段含义
m_ids当前活跃的事务ID集合
min_trx_id最小活跃事务ID
max_trx_id预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)
creator_trx_idReadView创建者的事务ID

ReadView一共有四种匹配规则:

条件能否访问说明
trx_id == creatro_trx_id可以访问该版本成立,说明数据是当前这个事务更改的。
trx_id < min_trx_id可以访问该版本成立,说明数据已经提交了。
trx_id > max_trx_id不可以访问该版本成立,说明该事务是在ReadView生成后才开启的。
min_trx_id <= trx_id <= max_trx_id如果trx_id不在m_ids中,那么可以访问该版本成立,说明数据已经提交。

不同隔离级别下MVCC分析

READ-COMMITTED隔离级别

前面有提到过在READ-COMMITTED隔离级别下事务在每次快照读SQL执行时创建ReadView,每次创建的ReadView的四个字段对应的值也是不同的,所以在READ-COMMITTED隔离级别下每次快照读SQL获取的数据可能也是不同的。

下面通过一个READ-COMMITTED隔离级别下并发事务的案例来详细看看:

现有四个并发事务同时访问一条数据:

在上述并发事务中,事务5查询了两次id为1的数据,因为当前的隔离级别设置为了READ-COMMITTED,事务在每次快照读SQL执行时创建一个ReadView,每次生成的ReadView中的四个字段值都不同。那么三次快照读都会根据生成的ReadView中的字段进行规则匹配,从而决定返回的数据。接下来看看流程:

事务5第一次快照读解读

事务5第一次进行查询时生成的ReadView以及原数据如下图:

在匹配版本数据前,先与表中数据进行匹配:

该数据对应的DB_TRX_ID为3,此时MVCC就会通过ReadView带着这条数据去进行规则匹配:

  • 首先是第一条规则db_trx_id == creator_trx_id,db_trx_id(3)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id < min_trx_id,db_trx_id(3)不小于min_trx_id(3)故不成立;

  • 第三条规则db_trx_id > max_trx_id,db_trx_id(3)小于max_trx_id(6)故不成立;

  • 第四条规则min_trx_id <= db_trx_id <= max_trx_id,db_trx_id(3)在min_trx(3)与max_trx_id(6)之间,但是同时处于m_ids(3,4,5)集合之中故也不成立。

经过这次匹配,表中最新的数据无法匹配,故要与MVCC版本链中最上面的数据进行规则匹配

与MVCC版本链中最上方的版本进行匹配:

  • 第一条规则db_trx_id(2)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id(2)小于min_trx_id(3),该版本的数据满足匹配规则中的第二条,说明数据已经提交,此时匹配将终止并返回这个版本对应的数据。

事务5第二次快照读

因为当前事务的隔离级别为READ-COMMITTED(读已提交),所以在每次快照读的时候都会创建一个ReadView,所以事务5第二次进行查询时生成的ReadView以及原数据如下图:

在匹配版本数据前,先与表中数据进行匹配:

该数据对应的DB_TRX_ID为4,此时MVCC就会通过ReadView带着这条数据去进行规则匹配:

  • 首先是第一条规则db_trx_id == creator_trx_id,db_trx_id(4)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id < min_trx_id,db_trx_id(4)不小于min_trx_id(4)故不成立;

  • 第三条规则db_trx_id > max_trx_id,db_trx_id(4)小于max_trx_id(6)故不成立;

  • 第四条规则min_trx_id <= db_trx_id <= max_trx_id,db_trx_id(4)在min_trx(4)与max_trx_id(6)之间,但是同时处于m_ids(4,5)集合之中故也不成立。

经过这次匹配,表中最新的数据无法匹配,故要与MVCC版本链中最上面的数据进行规则匹配

与MVCC版本链中最上方的版本进行匹配:

  • 第一条规则db_trx_id(3)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id(3)小于min_trx_id(4),该版本的数据满足匹配规则中的第二条,说明数据已经提交,此时匹配将终止并返回这个版本对应的数据。

REPEATABLE-READ级别

现在来看看REPEATABLE-READ可重复读隔离级别有什么不同的地方。同样,有四个并发事务同时访问一条数据:

在上述并发事务中,事务5查询了两次id为1的数据,因为当前的隔离级别设置为了REPEATABLE-READ,事务在第一次快照读SQL执行时创建ReadView,后续该事务所有的快照读都复用该ReadView。接下来看看流程:

事务5第一次快照读解读

事务5第一次进行查询时生成的ReadView以及原数据如下图:

在匹配版本数据前,先与表中数据进行匹配:

该数据对应的DB_TRX_ID为3,此时MVCC就会通过ReadView带着这条数据去进行规则匹配:

  • 首先是第一条规则db_trx_id == creator_trx_id,db_trx_id(3)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id < min_trx_id,db_trx_id(3)不小于min_trx_id(3)故不成立;

  • 第三条规则db_trx_id > max_trx_id,db_trx_id(3)小于max_trx_id(6)故不成立;

  • 第四条规则min_trx_id <= db_trx_id <= max_trx_id,db_trx_id(3)在min_trx(3)与max_trx_id(6)之间,但是同时处于m_ids(3,4,5)集合之中故也不成立。

经过这次匹配,表中最新的数据无法匹配,故要与MVCC版本链中最上面的数据进行规则匹配

与MVCC版本链中最上方的版本进行匹配:

  • 第一条规则db_trx_id(2)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id(2)小于min_trx_id(3),该版本的数据满足匹配规则中的第二条,说明数据已经提交,此时匹配将终止并返回这个版本对应的数据。

事务5第二次快照读解读

因为当前事务的隔离级别为REPEATABLE-READ(可重复读),所以第二次快照读也会沿用第一次快照读时创建的ReadView,如下:

在匹配版本数据前,先与表中数据进行匹配:

该数据对应的DB_TRX_ID为4,此时MVCC就会通过ReadView带着这条数据去进行规则匹配:

  • 首先是第一条规则db_trx_id == creator_trx_id,db_trx_id(4)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id < min_trx_id,db_trx_id(4)不小于min_trx_id(3)故不成立;

  • 第三条规则db_trx_id > max_trx_id,db_trx_id(4)小于max_trx_id(6)故不成立;

  • 第四条规则min_trx_id <= db_trx_id <= max_trx_id,db_trx_id(4)在min_trx(4)与max_trx_id(6)之间,但是同时处于m_ids(4,5)集合之中故也不成立。

经过这次匹配,表中最新的数据无法匹配,故要与MVCC版本链中最上面的数据进行规则匹配

与MVCC版本链中最上方的版本进行匹配:

  • 第一条规则db_trx_id(3)不等于creator_trx_id(5)故不成立;

  • 第二条规则db_trx_id(3)不小于min_trx_id(4)故不成立;

  • 第三条规则db_trx_id小于max_trx_id(6)故不成立;

  • 第四条规则db_trx_id(3)在min_trx(3)与max_trx_id(6)之间,但是同时处于m_ids(3,4,5)集合之中故也不成立。

经过第二次匹配,MVCC版本链中最上层的数据版本也无法匹配,故要与第二条版本进行匹配

与MVCC版本链中第二条版本进行匹配:

  • 第一条规则db_trx_id(2)不等于creator_trx_id(5)故不成立;

     

  • 第二条规则db_trx_id(2)小于min_trx_id(3),该版本的数据满足匹配规则中的第二条,说明数据已经提交,此时匹配将终止并返回这个版本对应的数据。

Enjoy GreatSQL :)

让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径 摘要 在RAP应用中,action弹窗参数经常缺乏必填校验,导致用户体验差。本文提出两种解决方案:1)在action实现中手动校验,简单但交互不流畅;2)通过root abstract entity和abstract BDEF建模,利用field(mandatory)实现框架级校验,推荐此长期方案。后者将约束集中到模型层,使UI与执行期校验一致,特别适合ABAP Cloud环境。以Excel导入为例,强制填写备注和明确选择试运行,可避免审计问题,提升系统可靠性。 阅读详情

相关推荐

Comsol PDE教程

很棒的Comsol自定义偏微分方程的教程,而且是中文的,简单易学。

mysql is_nullable_MySQL使用SQL查询字段详细信息

我们都知道在建表的时候定义字段类型等信息,虽然可以通过desc 表名来查询,但是有些却显示不了,那么如何查看其他信息呢?首先,数据库里面有个数据库是叫mysql数据库,里面提供了一张名为INFORMATION_SCHEMA表,我们可以利用这张表了解很多数据库数据信息,这也是SQL注入漏洞里面要利用的。1、通过下面代码能查询MoChou数据库里面Blog表的全部信息。SELECT*FROMINFO...

weixin_42484858的博客 1389

mysql如何将表结构导出到excel

需求如下 导出表的结构,和字段备注信息,表名等。不需要借用第三方工具即可实现。 SELECT TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 FROM INFORMATION_SCHEMA.COLUMNS where -- developerclub为数据库名称,到时候只需要修改成你要导出表结构的数据库即可 table_sch

图文结合带搞懂InnoDB MVCC

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQLMySQL的国产分支版本,使用上与MySQL一致。 前情提要 当前读 快照读 什么是MVCC 三个隐藏字段 Undo Log回滚日志 MVCC版本链 ReadView读视图 不同隔离级别下MVCC分析 READ-COMMITTED隔离级别 REPEATABLE-READ隔离级别 前情提要 事务有四大特性ACID分别是:原子性(Atomicity)、一致性(Consistency)、隔离性

GreatSQL2021的博客 734

mysql is_nullable_Mysql 中is null 和 =null 的区别

mysql中,筛选非空的时候经常会用到is not null和!=null,这两种方法单从字面上来看感觉是差不多的,其实如果去运行一下试试的话差别会很大!为什么会出现这种情况呢?null 表示什么也不是, 不能=、>、< … 所有的判断,结果都是false,所有只能用 is null进行判断。默认情况下,推荐使用 IS NOT NULL去判断,因为SQL默认情况下对!= Null的判...

weixin_36198509的博客 2063

mysql is_nullable_MySQL replace into 语句浅析(一)_MySQL - is_null

...);var_dump(isset($f));echo "";//3.is_null的输出var_dump(is_null($a));var_dump(is_null($b));var_dump(is_null($c));var_dump(is_null($d));var_dump(is_null($e));var_dump(is_null($f));?&gt...一 介绍在笔者支持业...

weixin_39640417的博客 537

cockroach如何修改字段为is_nullable属性、默认值设置、字段类型、字段删除与重命名

修改is_nullable属性 #设置字段为非null属性:(表subscriptions中字段 newsletter 为非null) ALTER TABLE subscriptions ALTER COLUMN newsletter SET NOT NULL; #删除字段原先的非null设置:(删除表subscriptions中字段 newsletter 可以为null) ALTER TABLE subscriptions ALTER COLUMN newsletter DROP NOT NULL;

wzbwzt的博客 986

【面试专栏 | MySQLMySQL事务底层实现拆解:Redo/Undo Log+锁+MVCC,一文讲透ACID

本文深入解析MySQL事务的底层实现原理,围绕ACID特性拆解四大核心组件:Redo Log保证持久性、Undo Log实现原子性、锁机制确保隔离性、MVCC提升并发度。通过组件协同流程图和通俗示例,阐明事务从开始到提交的全过程,并针对高频面试问题(如Redo Log与BinLog区别)给出专业解答,帮助开发者掌握事务本质,从容应对技术面试。

m0_58782205的博客 493

mysql自定义格式导出表结构

SELECT COLUMN_NAME 字段, COLUMN_TYPE 类型, IF(IS_NULLABLE='NO','是','否') AS '空', COLUMN_DEFAULT 默认, COLUMN_COMMENT 注释, CHARACTER_MAXIMUM_LENGTH as '字符长度' FROM INFORMATION_SCHEMA.COLUMNS where table_schema ='库名' AND table_name = '表名' ...

作为一个长者,有必要记录下人生经验 742

查询所有表、索引、视图信息的SQL语句-Mysql/oracle/sql server的不同实现方式

注:所有查询默认在管理员用户下进行 ----------------------------------Mysql中-------------------------------------------- 一、查询数据库内所有表的基本信息 在Mysql中information_schema.TABLES表存储了数据表的元数据信息,下面对常用的字段进行介绍: TABLE_SCHEMA 记录数据库名; TABLE_NAME 记录数据表名; ENG...

weixin_43912785的博客 4578

详解 MySql InnoDBMVCC 实现机制

MVCC,全称 Multi-Version Concurrency Control,即多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCCMySql InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理 读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

流华追梦的专栏 1741

python 提取固定列名数据_python获取数据库列名

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,提供数据库优化方面专业建议,在业务高峰期与用户共同保障数据库系统平...

weixin_39806288的博客 6228

InnoDB下的MVCC

MVCC,是采用乐观锁思想的一种方式; 在 MySQL 中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,但不能解决幻读问题。 如果想要解决幻读问题,就需要采用串行化的方式,也就是将隔离级别提升到最高,但这样一来就会大幅降低数据库的事务并发能力。 我们也可以采用MVCC+Next-Key Lock的方式来解决幻读问题。 MVCC 是什么 MVCC 的英文全称是 Multiversion Concurrency Control,即多版本并发控制技术MVCC 是通过数据行的多个版本管

shade7的博客 1771

MYSQL -- 查表字段描述SQL

查询表字段描述SQL: SELECT COLUMN_NAME,column_comment FROM INFORMATION_SCHEMA.Columns WHERE table_name='t_user'

GP的空间 3010

InnoDB MVCC 机制

本文详细的介绍了什么是MVCC?为什么要有MVCC?以及MVCC的内部实现原理:包括Undo Log的版本链是如何组织的,RR、RC两个级别下一致性读是如何实现的等。通过案例、插图,以最通俗易懂的方式,让你彻底掌握MVCC的来龙去脉。 1 什么是MVCC MVCC (Multiversion Concurrency Control)中文全称叫多版本并发控制,是现代数据库(包括MySQL、Oracle、PostgreSQL等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的...

微信公众号:一颗向上的草莓 497

MySQL InnoDB MVCC 机制的原理及实现

什么是 MVCC MVCC (Multiversion Concurrency Control)中文全程叫多版本并发控制,是现代数据库(包括MySQL、Oracle、PostgreSQL等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的吞吐性能。 如此一来不同的事务在并发过程中,SELECT操作可以不加锁而是通过MVCC机制读取指定的版本历史记录,并通过一些手段保证保证读取的记录值符合事务所处的隔离级别,从而解决并发场景下的读写冲突。 下面举一个多版本读的例子,例如两...

骏马逸动,心随你动的博客 1231

mysql】关于innodbMVCC的一些理解

一、MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能 读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改...

weixin_34376986的博客 453

MySQLInnodb引擎中的MVCC

  一、MVCC简介   MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能   读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事...

博而不精 205

innodb下的mvcc_浅谈MVCC

简介MVCC(Multi-Version Concurrency Control)即多版本并发控制。MVCC的实现原理我们在了解MVCC之前,首先先了解一下几个比较常见的锁。读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。写锁:又...

weixin_42502363的博客 368

硬核解析 MySQLMVCC 实现原理,面试官看了都直呼内行

MVCC全称是(多版本并发控制),是一种并发控制的方法,通过维护一个数据的多个版本,减少读写操作的冲突。如果没有MVCC,想要实现同一条数据的并发读写,还要保证数据的安全性,就需要操作数据的时候加读锁和写锁,这样就降低了数据库的并发性能。有了MVCC,就相当于把同一份数据生成了多个版本,在操作的开始各生成一个快照,读写操作互不影响。无需加锁,也实现数据的安全性和事务的隔离性。事务的四大特性中隔离性就是基于MVCC实现的。说 MVCC 的实现原理之前,先说一下事务的隔离级别。...

weixin_70730532的博客 306

InnoDBMVCC大致实现原理 与 锁规则

事务隔离性的支持 —— MVCC 文章目录事务隔离性的支持 —— MVCC概述利用undo log 实现 ”保存“ 多版本数据如何确定快照版本 —— 实现一致性读当前读 —— 防止更新丢失一致性读 —— 事务的可重复读 在 MySQL 里,有两个“视图”的概念:一个是 view。它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是 create view … ,而它的查询方法与表一样。 概述 MVCC是多版本并发控制(Multi-Version Concurrency

qq_53111905的博客 655
上一篇: 技术干货|深入浅出MGR—MGR性能优化
下一篇: 联合评测 | GreatSQL开源数据库在DapuStor Roealsen5 NVMe SSD中的应用探索
万里数据库
博客等级 码龄5年 169粉丝 66原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值