hymn

忽有故人心头过,回首山河已是秋。

  menu
132 文章
0 浏览
0 当前访客
ღゝ◡╹)ノ❤️

innodb 快照读,在RR和RC下有何差异?

RC 和 RR

读提交下: 快照读总是可以读取到最新的数据
解决了读脏数据,保证读取到的数据都是已经事务提交了的。
但是会产生“读幻影行”,同一个事务里面,可能两次读取到的数据不一致。

可重复读: 某个事务首次读取的时间为T,后续读取的数据不会读取在T之后写入的记录,以保证数据事务读取到的数据一致,
解决了读脏数据和读幻影行。

例子:
表中有三条记录:
1, shenjian
2, zhangsan
3, lisi

A1: start transaction;
B1: start transaction;
A2: select * from t;
B2: insert into t values (4, wangwu);
A3: select * from t;
B3: commit;
A4: select * from t;

在RR 下A2,A3,A4读取的结果集
A1:1,2,3。A事务的第一次读取,时间T

A2:1,2,3。因为B还没提交

A3:1,2,3。因为B是在T之后提交的,

回答:RC下

(1)A2读到的结果集是{1, 2, 3};

(2)A3读到的结果集也是{1, 2, 3},因为B还没有提交;

(3)A4读到的结果集还是{1, 2, 3, 4},因为事务B已经提交;

事务的开始时间不一样,不会影响“快照读”的结果

RR下,事务在第一个Read操作时,会建立Read View,读取到的和第一次读取到的数据一样
RC下,事务在每次Read操作时,都会建立Read View,读取到的都是提交后的最新数据。


标题:innodb 快照读,在RR和RC下有何差异?
作者:hymn
地址:https://dxyhymn.com/articles/2020/06/24/1592993616626.html