当前位置: 首页 > 科技观察

InnoDB,快照读取,RR和RC有什么区别?(很多人自以为懂了,,,)

时间:2023-03-13 17:28:25 科技观察

什么是SnapshotRead?MySQL数据库和InnoDB存储引擎,为了提高并发性,在并发事务中使用MVCC机制读取数据行历史数据版本,无锁,提高并发性,一种一致性非锁定读(ConsistentNonlockingRead)。画外音:本文所有讨论均基于MySQL-InnoDB。快照读内核原理详见:《??InnoDB并发如此高,原因竟然在这???》什么是ReadCommitted?(1)在数据库领域,是一种事务隔离级别,简称RC;(2)解决了“读脏”问题,确保读取到的数据行全部由已提交的事务写入;(3)可能存在“读幻行”的问题。在同一个事务中,连续的相同读取可能会读取到不同的结果集;什么是可重复读(RepeatedRead)?(1)在数据库领域,一种事务隔离级别,简称RR;(2)既解决了“readdirty”问题,也部分解决了“readphantomrow”问题。在同一个事务中,连续的同一个read读取同一个结果集;在readcommit(RC)和repeatableread(RR)两种不同事务的隔离级别下,snapshotread有什么区别?让我们一起做一些实验。假设有一张InnoDB表:t(idPK,name);表中有3条记录:shenjianzhangsanlisicase1,两个并发事务A和B执行时序如下(A先于B开始,B先于A结束):A1:开始事务;B1:开始交易;A2:select*fromt;B2:insertintotvalues(4,wangwu);A3:select*fromt;B3:commit;A4:select*fromt;问题一:假设事务事务的隔离级别为repeatablereadRR。对于事务A中的三个查询,A2、A3、A4分别读取了哪些结果集?问题2:假设事务的隔离级别为readcommitRC,A2、A3、A4分别读取什么结果集?Case2还是上面的两个事务,只是A和B的开始时间略有不同(B先于A开始,B先于A结束):B1:开始事务;A1:开始事务;A2:select*fromt;B2:insertintotvalues(4,wangwu);A3:select*fromt;B3:提交;A4:从t中选择*;问题三:假设事务的隔离级别为可重复读RR,对于事务A中的三个查询,A2、A3、A4分别读取了哪些结果集?问题4:假设事务的隔离级别为readcommitRC,那么A2、A3、A4的结果集是什么?情况3还是并发事务A和B(A先于B开始,B先于A结束):A1:开始事务;B1:开始交易;B2:插入t值(4,wangwu);B3:提交;A2:从t中选择*;问题5:假设事务的隔离级别为repeatablereadRR,事务A中A2查询的结果集是什么?问题6:假设事务的隔离级别为ReadCommitRC,A2的结果集是什么?case4,再次更改事务的开始时间(B先于A开始,B先于A结束):情况4,改变事务的开始时间(B先于A开始,B先于A结束):B1:开始事务;A1:开始事务;B2:插入t值(4,wangwu);B3:提交;A2:从t中选择*;问题七:假设事务的隔离级别为repeatablereadRR,事务A中A2查询的结果集是什么?问题8:假设事务的隔离级别是readcommitRC,那么A2的结果是什么集合?很多时候,我们以为自己懂了,其实...