资料总结 资料总结
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

linghui Wu

一只努力学飞的鱼
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据库表设计
  • mysql

    • 索引
    • mysql
    • Sql优化
    • 事务
    • 锁机制
    • MVCC
      • undo日志版本链
      • read view
        • 两部分组成
        • 生成时机
      • undo版本链和read-view的对比规则
        • 参考资料
    • MySQL高可用架构
    • 运维内容
  • redis

  • MongoDB

  • InfluxDB
  • 数据库
  • mysql
wulinghui
2022-02-21
目录

MVCC

# MVCC多版本并发控制机制

  • 在读已提交和可重复读隔离级别下都实现了MVCC机制
  • 对一行数据的读和写两个操作不通过加锁互斥来保证隔离性,避免了加锁互斥
  • 读-写 即一个事务进行读取操作,另一个进行写入操作。这种情况下可能会产生脏读、不可重复读、幻读。最好的方案是读操作利用多版本并发控制(MVCC),写操作进行加锁。
  • 总结: MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取 同一条数据在版本链上的不同版本数据。

# 实现/机制

# undo日志版本链

  • 定义:: 记录某个数据历次被修改的版本,并通过回滚指针连接起来,当发生数据回滚时可以通过undo版本链恢复到以前的数据。
  • 据被多个事务依次修改过后,在每个事务修改完后,undo回滚日志会保留修改前的数据,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链
  • 版本链状态 : 已提交的事务、未提交和已提交的事务、未开始的事务

# read view

一致性视图,快照,也就是这个查询的数据副本。

# 两部分组成

  • 所有未提交事务id数组
  • 已提交的最大事务id

# 生成时机

  • 在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化
  • 如果是读已提交隔离级别在每次执行查询sql时都会重新生成
  • 由以上两点区别,导致不同的隔离级别查询结果不一致!

# undo版本链和read-view的对比规则

undo版本链从上往下的循环,取事务id,和read-view进行对比

# 参考资料

mysql的MVCC机制详解 (opens new window)

编辑 (opens new window)
上次更新: 2023/01/24, 15:21:15
锁机制
MySQL高可用架构

← 锁机制 MySQL高可用架构→

最近更新
01
架构升级踩坑之路
02-27
02
总结
02-27
03
语法学习
02-27
更多文章>
| Copyright © 2021-2025 Wu lingui |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式