mvcc原理

mvcc:多版本并发控制
multiple version concurrency control

在共享表空间的第五个页是undo(一般是通过设置innodb_undo_directory undo独立表空间路径,把undo从ibdata分离出去)
系统事务表里指向128 个undo 段,每个undo 段里面有段头和一些undo
数据页,一个undo 段头页里,可以写512 个事务,所以一共可以写128*512
个并发事务。

事务开始到结束,undo 做了什么?

找系统事务表(轮询的方式)—>找到空闲的回滚段—>在回滚段的段头块里
(1024 事务槽、512 个事务)找到一个空闲的事务槽,把事务信息写入事务槽,
一个事务就开始了,这时候要修改数据块,把修改前的数据要放到undo 数据块
里去,脏数据块里有roll pointer 回滚指针,指向undo 回滚数据页中原来数据存
放的位置,修改很多数据块,每个修改的数据块的roll pointer 都指向放在undo
回滚数据块中的自己修改前的undo 数据,undo 数据块都是链起来的,事务槽
指向最后一个事务块,这是一个事务,如果commit 提交了,需要在事务槽里把
这个事务标志成已提交。

undo 的几个作用:

1、rollback
2、写不阻塞读
3、保证数据一致性
4、崩溃恢复(redo 前滚,undo 回滚。未提交事务主动回滚,未提交事务信息
在事务槽里写着)

MVCC 特性:

实现了一致性读:
1、避免脏读(已提交读),写不阻塞读
2、实现可重复读

MVCC 实现原理:

修改一个数据页里的数据行,事务开始后,先把原事务的事务id,rollpoint指针和原数据写入undo块,新的rollpoint指针指向上一次的指针,事务提交了。这时候又来了一个数据,还是修改这行数据,相当于新的roll pointer 从undo 事务块指向了旧的undo 事务块,这样在undo 里面可以保存数据的不同时刻的多个版本。

100 1 9:00之前的数据
101 10 9:00的修改
102 20 9:05的修改

mvcc使用场景

9:00执行了一个select查询一个10000万行的表,这个表有一行是9:05修改的在查询到这行数据的时候,发现这行数据是9:05修改的,而我是9点查询的,(9:05之后才查询到这行数据)所以王9点钱找一个举例9:00查询时间最近的一个版本来返给用户

你可能感兴趣的:(mvcc原理)