MVVC机制
🥙一、事务
事务是一组操作的集合,一个不可分割单位,把所有操作全部向系统提交,要么全部成功,要么全部失败。
ACID 是指数据库事务正确执行的四个基本特性,MySQL 的 InnoDB 存储引擎完整实现了这些特性(而 MyISAM 等其他引擎不支持完整的 ACID)。
事务四大特性详解(ACID):
- 原子性(Atomicity)
- 事务是不可分割的最小工作单元,要么全部执行成功,要么全部失败回滚
- MySQL 通过 undo log(回滚日志)实现
- 一致性(Consistency)
- 事务执行前后,数据库从一个一致状态变到另一个一致状态
- 不会破坏数据库的完整性约束
- 这是原子性、隔离性和持久性的共同结果
- 隔离性(Isolation)
- 多个并发事务执行时,一个事务不应影响其他事务
- MySQL 提供四种隔离级别(读未提交、读已提交、可重复读、串行化)
- 默认使用可重复读(REPEATABLE READ)隔离级别
- 通过锁机制和 MVCC(多版本并发控制)实现
- 持久性(Durability)
- 事务一旦提交,其结果就是永久性的
- 即使系统故障也不会丢失
- MySQL 通过 redo log(重做日志)实现

一、持久性&redo log
提交操作后:
1.会将修改暂时存放在Buffer Pool缓冲区(脏页数据),同时将修改记录写入缓冲区Redolog buffer。
2.在1中的Redolog buffe写入信息后,会马上同步到磁盘区的redolog file。redo log记录的是物理日志。
3.一段时间后同步Buffer Pool中的数据到磁盘(xxx.ibd)中,若失败可用redolog file恢复。
以此保证持久性。
- 为什么不马上同步修改数据到磁盘而是同步修改的记录?因为前者的修改操作是对数据库中数据的随机的修改,而后者记录的操作是追加写入,消耗远小于前者。


二、原子性&undo log
1.Undolog是存储的回滚日志,为了保证回滚到提交之前。为回滚或MVCC提供日志。
2.Undolog中存储的是SQL执行相反的回滚语句。(如语句Insert,Undolog中存的是Delete)
三、MVCC
作用:在快照读时通过MVCC查找历史版本。
MVCC全称Multi-version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。
3.1 隐式字段
DB_TRX_ID:最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。DB_ROW_ID:隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

3.2 UndoLog版本链
- 回滚日志,在insert.update、delete的时候产生的便于数据回滚的日志。
- 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。
- 而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即删除。

3.3 ReadView
ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的) id。
Readview中包含了四个核心字段:
- m_ids:当前活跃的事务ID集合。
- min_trx_id:最小活跃事务ID。
- max_trx_id:预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)。
- creator_trx_id:ReadView创建者的事务ID。

3.4 MVCC 实现原理
MVCC通过结合隐藏字段,ReadView,Undo Log版本链三个关键来实现。
- 根据不同的隔离级别,有不同规则产生ReadView。RR是在第一次执行快照读时产生,后续读时复用ReadView;RC是每次执行快照读时产生。
- 利用隐式字段中的trx_id匹配ReadView规则,若满足则进行操作,若不满足规则,利用隐式字段中的toll_ptr,在undo log版本链中找到满足规则的记录进行操作。
MVCC结合隐式字段
在RC(读已提交)下,在事务
每次执行快照读时生成ReadView,无法解决不可重复读

在RR(可重复读)下,在事务
第一次执行快照读时生成ReadView,后续读复用ReadView

四、事务的实现原理
MVCC核心:隐藏字段,ReadView,Undo Log版本链

- MVCC+锁实现隔离性。
- redo log实现持久性 、undo log实现原子性
- redo log+undo log 实现一致性