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,读取到的都是提交后的最新数据。
参考:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961513&idx=1&sn=e955133cbd87c652d9bcbccad608190e&chksm=bd2d0d758a5a84632046e7c692064b415621ae329426adf77ae03e4a0cc55d662d6d4c543019&scene=21#wechat_redirect