InnoDB,快照读,在RR和RC下有何差异?(很多人,以为自己懂了...)

什么是快照读(Snapshot Read)?
MySQL数据库,InnoDB存储引擎,为了提高并发,使用MVCC机制,在并发事务时,通过读取数据行的历史数据版本,不加锁,来提高并发的一种不加锁一致性读(Consistent Nonlocking Read)
画外音:本文所有讨论基于MySQL-InnoDB。
 
快照读的内核原理,详见:
InnoDB并发如此高,原因竟然在这?
 
什么是读提交(Read Committed)?
(1)数据库领域,事务隔离级别的一种,简称RC;
(2)它解决“读脏”问题,保证读取到的数据行都是已提交事务写入的;
(3)它可能存在“读幻影行”问题,同一个事务里,连续相同的read可能读到不同的结果集;
 
什么是可重复读(Repeated Read)?
(1)数据库领域,事务隔离级别的一种,简称RR;
(2)它不但解决“读脏”问题,还部分解决了“读幻影行”问题,同一个事务里,连续相同的read读到相同的结果集;
 
读提交(RC),可重复读(RR)两个不同的事务的隔离级别下,快照读有什么不同呢?
我们一起来做一些实验。
 
假设有InnoDB表:

t(id PK, name);

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

 
case 1,两个并发事务A,B执行的时间序列如下(A先于B开始,B先于A结束):

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;

 
提问1:假设事务的隔离级别是可重复读RR,事务A中的三次查询,A2, A3, A4分别读到什么结果集?
提问2:假设事务的隔离级别是读提交RC,A2, A3, A4又分别读到什么结果集呢?
 
case 2,仍然是上面的两个事务,只是A和B开始时间稍有不同(B先于A开始,B先于A结束):

         B1: start transaction;

A1: start transaction;

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

 
提问3:假设事务的隔离级别是可重复读RR,事务A中的三次查询,A2, A3, A4分别读到什么结果集?
提问4:假设事务的隔离级别是读提交RC,A2, A3, A4的结果集又是什么呢?
 
case 3,仍然是并发的事务A与B(A先于B开始,B先于A结束):

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

 
提问5:假设事务的隔离级别是可重复读RR,事务A中的A2查询,结果集是什么?
提问6:假设事务的隔离级别是读提交RC,A2的结果集又是什么呢?
 
case 4,事务开始的时间再换一下(B先于A开始,B先于A结束):

         B1: start transaction;

A1: start transaction;

         B2: insert into t values (4, wangwu);

         B3: commit;
A2: select * from t;

提问7:假设事务的隔离级别是可重复读RR,事务A中的A2查询,结果集是什么?
提问8:假设事务的隔离级别是读提交RC,A2的结果集又是什么呢?
 
很多时候,我们以为自己懂了,其实...
架构师之路-分享可落地的架构文章
 
相关文章
InnoDB并发如此高,原因竟然在这?
 
知其然,知其所以然,下一篇揭晓答案。

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5829

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月10日 下午10:23
下一篇 2022年5月10日 下午10:26

相关推荐

  • QQ好友状态,QQ群友状态,究竟是推还是拉?

    状态同步,有好友状态的同步,有群友状态的同步,有的需要实时同步,有的能够容忍延时。任何脱离业务的架构设计都是耍流氓,不同场景下,状态同步,究竟是推送还是拉取呢? 用户的在线状态,分为客户端状态(端),服务端状态(云)两种形态。   什么是服务端状态? 服务端状态,主要分为在线online和离线offline,不同的状态,对于不同的业务处理流程可能不同。例如对...

    2022年5月15日
    5300
  • Centos 7 运行firefox出错

    Centos 7 在firefox官网下载了最新的安装包,运行后提示 1 2 3 4 # firefox XPCOMGlueLoad error for file /root/fuzzingbox/firefox/libmozgtk.so: libgtk-3.so.0: cannot open shared object file: No such file...

    技术 2022年5月28日
    16300
  • 如何排查死锁,死锁是怎么产生的,如何处理死锁

    之前刚学习多线程时,由于各种锁的操作不当,经常不经意间程序写了代码就发生了死锁,不是在灰度测试的时候被测出来,就是在代码review的时候被提前发现。 这种死锁的经历不知道大家有没有,不过怎么说都是一个面试高频题目,面试官是肯定希望你经历过的,没经历过那也得看看某八股文职业选手的文章装作经历过。 那么什么是死锁呢?为什么会产生死锁呢? 什么是死锁 敖丙和小美...

    2022年5月18日
    5500
  • 解决某宝、某鱼等淘系App无法抓包问题

    使用Charles、Fiddle等抓包工具对淘系App进行抓包时,你会发现总是抓不到包,出现请求不走Charles代理的情况。这是因为淘系app底层网络通信的协议并不是普通的http协议,而是自己实现的一套私有协议Spdy。 通过对App反编译破解后分析发现,部分接口由于使用了spdy协议,导致无法抓包。 所以我们只要通过hook将是否使用spdy返回fal...

    2022年5月7日
    21600
  • msfvenom 使用

    木马连接方式 正向连接(bind) 是我主动去连接别人机器上的某个端口,很显然,这样极易被对方防火墙拦掉反向连接(reverse)是让别人机器上的某个端口上的流量主动连到我机器上的某个端口上,起码暂时对各类应用层防火墙的穿透效果还是蛮不错的  msfvenom 常用选项123456789-l 列出所有可用的payload,编码器,空指令……-p 指...

    技术 2022年5月28日
    7200

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信