问题引入
S.NO
session1
session2
1
start transaction;
2
select f1 from t1;
3
start transaction;
4
update t2 set f1 = f1+1;
5
commit;
6
select f1 from t2;
创建一致性视图
当事物里的第一条select语句开始执行时InnoDB会创建一致性读视图(可以理解为快照
快照(read_view_t)包含了当前已开始未提交的事物列表
InnoDB表的隐藏字段
InnoDB表的隐藏字段
MVCC
我们看到的每一个元组(或者说一条记录)包含了一个创建它的事物以及一串老版本元组的列表
如何工作
这样的话,一致性读的目标就被转化成一个使用一致性读视图的事务能否看到一个特定的事务(所做的update或者insert)
定理1,比创建一致性视图的事务要新的事务不会被它看到(通过隐藏字段DB_TRX_ID),定理2,创建视图时还在活动的事务不会被看见(通过一致性视图保存的那一串列表)
当一条记录被访问时,首先用上述两条定理判定一下它能不能被当前事物看见,如果能直接使用当前版本的值;如果不能则去判定该条记录是否有前任版本,没有的
话就是传说中的幻想读,掠过;有前任版本则循环找到合适的版本(利用隐藏字段DB_ROLL_PTR),从而消除不可重复读
阅读(107) | 评论(0) | 转发(0) |