icode icode
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

iqqcode

保持对技术的探索实践与热爱
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

    • DQL

    • MySQL进阶

      • 事务
      • B+树
      • 索引概念篇
      • 索引定义
      • 回表&索引覆盖&最左
      • 索引语法
      • 慢SQL优化
      • 索引失效及解决
      • 模糊查询优化
      • SQL语句执行流程
      • 存储引擎
      • MySQL锁
      • 主从复制
      • MVCC机制
        • 1. MVCC是什么
        • 2. MVCC解决什么问题
          • 什么是快照读
          • 什么是当前读
        • 3. InnoDB 的 MVCC实现
          • 事务版本号
          • 行记录的隐藏列
          • Undo Log
      • 行锁、表锁
  • 数据库
  • MySQL
  • MySQL进阶
iqqcode
2021-06-17
目录

MVCC机制

参考阅读🍳MySQL是怎么保证数据一致性的 (opens new window)

# 1. MVCC是什么

MVCC: Multiversion Concurrency Control,翻译为多版本并发控制,其目标就是为了提高数据库在高并发场景下的性能

【原理】:

简单来说就是保存数据的历史版本,通过比较版本号决定数据是否显示出来。读取数据的时候不需要加锁可以保证事务的隔离效果。

MVCC最大的优势:读不加锁,读写不冲突。在读多写少的场景下极大的增加了系统的并发性能

  • 行级锁的变种,减少加锁带来的开销(类比CAS)

  • 适用于读已提交、可重复读两个事务场景,解决不可重复读和幻读问题,MVCC 机制取代行锁,降低系统开销

# 2. MVCC解决什么问题

  1. 读写之间阻塞的问题。通过 MVCC 可以让读写互相不阻塞,读不相互阻塞,写不阻塞读,这样可以提升数据并发处理能力。
  2. 降低了死锁的概率。这个是因为 MVCC 采用了乐观锁的方式,读取数据时,不需要加锁,写操作,只需要锁定必要的行。
  3. 解决了一致性读的问题。当我们朝向某个数据库在时间点的快照是,只能看到这个时间点之前事务提交更新的结果,不能看到时间点之后事务提交的更新结果

# 什么是快照读

快照读,读取的是快照数据,不加锁的简单 Select 都属于快照读.

SELECT * FROM player WHERE ...
1

# 什么是当前读

当前读就是读的是最新数据,而不是历史的数据,加锁的 SELECT,或者对数据进行增删改都会进行当前读。

SELECT * FROM player LOCK IN SHARE MODE;
SELECT FROM player FOR UPDATE;

INSERT INTO player values ...

DELETE FROM player WHERE ...

UPDATE player SET ...
1
2
3
4
5
6
7
8

# 3. InnoDB 的 MVCC实现

事务版本号 + 行记录中的隐藏列 + Undo Log

# 事务版本号

每开启一个日志,都会从数据库中获得一个事务ID(也称为事务版本号),这个事务 ID 是自增的,通过 ID 大小,可以判断事务的时间顺序。

# 行记录的隐藏列

image-20201007181210245

  1. row_id :隐藏的行 ID ,用来生成默认的聚集索引。如果创建数据表时没指定聚集索引,这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引
  2. trx_id:数据事务 ID ,每次处理加一
  3. roll_ptr:回滚指针,指向这个记录的 Undo Log 信息

# Undo Log

InnoDB 将行记录快照保存在 Undo Log 里

650

数据行通过快照记录都通过链表的结构的串联了起来,每个快照都保存了 trx_id 事务ID,如果要找到历史快照,就可以通过遍历回滚指针的方式进行查找


【参考文章】MVCC机制总结 (opens new window)

编辑 (opens new window)
上次更新: 2021/06/27, 10:49:09
主从复制
行锁、表锁

← 主从复制 行锁、表锁→

最近更新
01
匿名内部类
10-08
02
函数式接口
10-08
03
ARouter-Kotlin踩坑
10-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 iqqcode | MIT License | 备案号-京ICP备2021028793号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×