一张图 击穿 MVCC 原理
2021-05-25 23:01:28 0 举报
MVCC、ReadView
作者其他创作
大纲/内容
min_trx_id <= 数据事务id < max_trx_id
id
name
创建版本
删除版本
1001
土豆
1
null
1002
茄子
数据事务id < min_trx_id
青椒,创建时间大,不满足
删除
ReadView 视图
更新
一个事务中查询2次
Transaction 4 BEGIN;DELETE FROM mvcctest WHERE id=2COMMIT;
初始数据
max_trx_id <= 数据事务id
5
4
事务开始时,会给每个事务生成一个 ReadView,记录当前活跃(未提交)事务,数据结构如下: trx_ids:当前系统中所有活跃(未提交)事务的版本号集合; min_trx_id:创建 ReadView时,活跃事务中最小的事务版本号; max_trx_id:创建 ReadView时,活跃事务中最大的事务版本号 +1; creator_trx_id:创建当前 ReadView 的事务版本号;ReadView 可见性判断:
假设在事务5之后执行第二次查询SELECT * FROM mvcctest;(第二次查询)
ReadView事务ID的列表根据 undo log 链循环获取上一个版本
事务id 在 trx_ids中,且等于 creator_trx_id
数据的事务id不在 trx_ids
删除版本就是事务的ID
Transaction 5 BEGIN;UPDATE mvcctest SET name='豆角' WHERE id=1COMMIT;
能看到的:1,第一次查询前已提交的事务2,查到本事务的修改
DB_ROW_ID
DB_TRX_ID
DB_ROLL_PTR
0001
NULL
0002
可见
不可见
1003
青椒
3
事务id 在 trx_ids中,且不等于 creator_trx_id
Transaction 2BEGIN;SELECT * FROM mvcctest; (第一次查询)
假设在事务4之后执行第二次查询SELECT * FROM mvcctest;(第二次查询)
旧数据记录删除版本新数据记录创建版本
创建版本就是事务的ID
假设在事务3之后执行第二次查询SELECT * FROM mvcctest;(第二次查询)
青椒,创建时间大,不满足豆角,创建时间大,不满足
插入
豆角
0 条评论
下一页