MVCC:多版本并发控制案例分析(一)

(笔记总结自b站马士兵教育课程)

一、简介

MVCC:全称multi-version Concurency control,多版本并发控制,是为了解决并发读写问题存在的。MVCC的实现原理由三部分组成:隐藏字段、undolog、readview。

二、概念补充

当前读:读取的总是最新的数据,例如update、insert、delete等等。

快照读:读取的是历史的数据,例如select。

数据库并发场景:

①读读:不会产生任何问题,也不需要进行并发控制。

②读写:会存在数据安全问题,比如脏读、幻读、不可重复读,可以通过加锁的方式来解决,但是会存在性能安全问题。

③写写:会存在数据安全问题,比如更新丢失问题。

三、隐藏字段和undolog

mysql所对应的行记录除了我们自定义的字段之外,mysql会默认的添加一些隐藏字段,对于用户是不可见的。

|-------------|-------------------------------------|
| DB_TRX_ID | 创建这条记录或者最后一次修改该记录的事务id |
| DB_ROLL_PTR | 回滚指针,指向这条记录的上一个历史版本 |
| DB_ROW_ID | 隐藏主键,当表创建的时候没有设置主键,那么会生成一个6字节的rowid |

(事务id:mysqlserver自动赋值,并且是递增的)

事务1新增一条记录:

|------|-----|-----------|-------------|-----------|
| name | age | DB_TRX_ID | DB_ROLL_PTR | DB_ROW_ID |
| ABC | 10 | 1 | NULL | 1 |

undolog:回滚日志,表示在进行insert、delete、update操作的时候产生的方便回滚的事务。

事务2修改name=DEF:

|------|-----|-----------|-------------|-----------|
| name | age | DB_TRX_ID | DB_ROLL_PTR | DB_ROW_ID |
| DEF | 10 | 2 | 0x123 | 1 |

此时undolog代码块:

|------|-----|-----------|-------------|-----------|
| name | age | DB_TRX_ID | DB_ROLL_PTR | DB_ROW_ID |
| ABC | 10 | 1 | NULL | 1 |

事务2中的DB_ROLL_PTR 中的地址记录的是事务1版本的数据在undolog的数据。

事务3修改age=12:

|------|-----|-----------|-------------|-----------|
| name | age | DB_TRX_ID | DB_ROLL_PTR | DB_ROW_ID |
| DEF | 12 | 3 | 0x456 | 1 |

此时undolog代码块:

|------|-----|-----------|-------------|-----------|
| name | age | DB_TRX_ID | DB_ROLL_PTR | DB_ROW_ID |
| DEF | 10 | 2 | 0x123 | 1 |

|------|-----|-----------|-------------|-----------|
| name | age | DB_TRX_ID | DB_ROLL_PTR | DB_ROW_ID |
| ABC | 10 | 1 | NULL | 1 |

事务3中的DB_ROLL_PTR 中的地址记录的是事务2版本的数据在undolog的数据,事务2中的DB_ROLL_PTR 中的地址记录的是事务1版本的数据在undolog的数据。

我们发现undolog最终会变成一个链表,链首表示的是最新的旧纪录,链尾表示的是最旧的旧纪录,undolog链表不会无限增加,后台有一个purge的线程来对undolog进行维护,当不需要的时候就会进行删除,在undolog删除的时候会分为两类,insert对应一类undolog,只要事务提交就可以删除,update、delete对应一类undolog,除了事务提交之后,还要保证mvcc不用才会删除。

相关推荐
難釋懷18 分钟前
OpenResty实现Redis查询
数据库·redis·openresty
别抢我的锅包肉38 分钟前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip
Database_Cool_39 分钟前
OpenClaw-Observability:基于 DuckDB 构建 OpenClaw 的全链路可观测体系
数据库·阿里云·ai
刘~浪地球1 小时前
Redis 从入门到精通(五):哈希操作详解
数据库·redis·哈希算法
zzh0812 小时前
MySQL高可用集群笔记
数据库·笔记·mysql
Shely20172 小时前
MySQL数据表管理
数据库·mysql
爬山算法2 小时前
MongoDB(80)如何在MongoDB中使用多文档事务?
数据库·python·mongodb
APguantou2 小时前
NCRE-三级数据库技术-第2章-需求分析
数据库·需求分析
寂夜了无痕3 小时前
MySQL 主从延迟全链路根因诊断与破局法则
数据库·mysql·mysql主从延迟
爱丽_3 小时前
分页为什么越翻越慢:offset 陷阱、seek 分页与索引排序优化
数据库·mysql