• MYSQL----innoDB存储引擎


    innoDB ---- 一个程序员都应该了解的概念

    1. innoDB逻辑存储结构

    在这里插入图片描述

    2. innoDB整体架构

    2.1 内存架构

    • Buffer Pool

    在这里插入图片描述

    • Change Buffer

    在这里插入图片描述

    • Adaptive Hash index

    在这里插入图片描述

    • log Buffer

    在这里插入图片描述

    2.2 磁盘结构

    • 系统表空间,每个表的单独表空间

    在这里插入图片描述

    • 通用表空间

    在这里插入图片描述

    • 双写缓冲区与redo log

    在这里插入图片描述

    2.3 后台线程

    在这里插入图片描述

    3. innoDB的事务原理

    3.1 回顾事务的特性

    ACID特性

    原子性,一致性,隔离性,持久性

    3.2 InnoDB保证这几种特性使用的机制

    在这里插入图片描述

    3.3 redo log保证事务持久性的方式

    WAL (write Ahead Logging)

    在这里插入图片描述

    3.4 undo log保证事务原子性的方式

    在这里插入图片描述

    3.5 MVCC+锁 保证事务隔离性的方式 (看下一大节)

    3.6 undo log+ redo log 保证事务一致性

    4. InnoDB ——MVCC

    多版本并发控制

    4.1 相关概念回顾

    • 当前读

      读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,比如:select … lock in share mode,select … for update,update,insert,delete(排他锁)都是一种当前读。

    • 快照读

      简单的select(不加锁)就是快照读,读取的是记录数据的可见版本,有可能是历史版本数据,不加锁,是非阻塞读。

      • Read Committed:每次select,都生成一个快照读
      • Repeatable Read:开启事务后第一个select语句才是快照读的地方
      • Serializable:快照读会退化为当前读。
    • MVCC

      全称为 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MYsql实现MVCC提供一个非阻塞读的功能。MVCC的具体实现,需要依赖于:

      • 三个隐式字段
      • undo log
      • readview

    4.2 记录中的隐藏字段

    在这里插入图片描述

    (其中,DB_ROW_ID是可能没有的)

    4.3 UNDO LOG日志

    • 回滚日志,在insert,update,delete的时候产生的便于数据回滚的日志
    • 在insert的时候,产生的undo log日志只会在回滚的时候需要,在事务提交之后,立即删除
    • 而update,delete的时候,产生的undo log日志不仅在回滚的时候需要,在快照读的时候也需要,不会被立即删除

    4.4 UNDO LOG版本链

    在这里插入图片描述

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

    4.5 MVCC-readview介绍

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

    (也就是说,快照读到底要读哪个版本的数据呢,就是由readview决定的)

    ReadView中包含的四个核心字段:

    在这里插入图片描述

    版本链数据访问规则

    其中trx_id指的是,undolog版本链中每一个版本中的DB_TRX_ID字段

    在这里插入图片描述

    注意

    不同的隔离级别,生成的ReadView的时机不同

    • Read Committed:在事务中每一次执行快照时生成ReadView
    • Repeatable Read:仅在事务中第一次执行快照读的时候生成readView,后续复用该readview。

    😜 MVCC实验演示1

    (RC 读提交隔离级别下的演示 : 在事务中每一次执行快照时生成ReadView)

    自己看图琢磨一下

    • 已经提交的事务会从m_ids中剔除
    • min_trx_id: 上一次修改记录的事务id
    • max_trx_id: 下一次要修改事务的id(该id具有未来性,可能目前还没有这个事务)

    在这里插入图片描述

    😻MVCC实验演示2

    (RR 可重复读隔离级别下的演示:仅在事务中第一次执行快照读的时候生成readView,后续复用该readview。)

    在这里插入图片描述

  • 相关阅读:
    C语言写txt文件和MATLAB 写txt文件
    (DenseNet)Densely Connected Convolutional Networks--Gao Huang
    kafka消息的序列化与反序列化
    前端实现表格生成序号001、002、003自增
    有谁知道这个这么弄吗?
    微信小程序部分知识点总结
    机器学习之交叉验证汇总及其Python代码
    2022年,我们为什么要学习C++?
    Python机器学习:Sklearn快速入门(稍微懂一些机器学习内容即可)
    华为数据管理——《华为数据之道》
  • 原文地址:https://blog.csdn.net/qq_42392049/article/details/126917929