MVCC图解
2023-04-19 16:27:05 0 举报
MVCC原理图解
作者其他创作
大纲/内容
表示生成ReadView时系统应该分配给下一个事务的id值
age
事务D(trx_id=40)
font color=\"#323232\
max_trx_id
20
undo log
ReadView
InnoDB为每行数据添加了三条隐藏字段:DB_TRX_ID:表示最后一次插入或更新该行的事物id。DB_ROLL_PTR:回滚指针,指向这一行数据更新前的undolog地址。DB_ROW_ID:如果没有设置主键且该表没有唯一非空索引的时候,InnoDB会使用该id来生成聚簇索引
SELECT * FROM user WHERE id = 1;
表示在生成ReadView时,当前系统中活跃的事物id列表
未提交
事务A
版本链1. 在每次进行update或者delete操作时2. 会将每次的操作详细记录在undo log中3. 每条undo log中都记录roll_pointer信息4. 通过roll_pointer进行关联,可以构成数据的版本链
COMMIT
40
1
41
name
事务A(trx_id=10)
min_trx_id
在读已提交的隔离级别下,事务内部的流程
事务B(trx_id=20)
李四
user表结构
UPDATE user set name='小明' where id = 1
30
男
id
事务C
王五
女
creator_trx_id
MVCC的生效场景在读已提交(RC)和可重复读(RR)这两种隔离级别下生效在读已提交的场景下:ReadView生成的时机是每个Select生成一个ReadView在可重复读的场景下:ReadView生成的时机是每个事物生成一个ReadView在InnoDB中默认开启了间隙锁:解决了幻读问题
版本链
14
事务C(trx_id=30)
sex
表示生成改ReadView的事物的事物id
事务B
m_ids
BEGIN
ReadView生成规则:1. 在读已提交的隔离级别下:事务中每次对数据进行SELECT都会生成一个ReadView。2. 在可重复读的隔离级别下:在一个事务中对一行数据第一次进行SELECT查询会生成一个ReadView,之后事务都讲使用该ReadView进行数据的读取。
表示在生成ReadView时,当前系统中活跃的读写事务中最小的事物id,也是m_ids中的最小值
(回滚指针)DB_ROLL_PTR
ReadView各参数意义
18
UPDATE user set name='小红' where id = 1
这里访问到事务A,结果是小明
小明
ReadView读取规则:1. 当 trx_id == creator_trx_id 时:可以访问这个版本2. 当 trx_id > max_trx_id 时:无法访问这个版本3. 当 trx_id < min_trx_id 时:可以访问这个版本4. 当 min_trx_id <= trx_id <= max_trx_id 时:如果trx_id在m_ids列表中则不可访问,反之可以
10
这里访问到事务B,结果是张三
事务D
已提交
张三
事务id(自增)DB_TRX_ID
收藏
0 条评论
回复 删除
下一页