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

数据库 MySQL
MySQL数据库,InnoDB存储引擎,为了提高并发,使用MVCC机制,在并发事务时,通过读取数据行的历史数据版本,不加锁,来提高并发的一种不加锁一致性读。

什么是快照读(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);

表中有三条记录:

  • shenjian
  • zhangsan
  • 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结束):

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的结果集又是什么呢?

很多时候,我们以为自己懂了,其实...

责任编辑:赵宁宁 来源: 架构师之路
相关推荐

2023-12-27 18:16:39

MVCC隔离级别幻读

2024-09-12 08:32:42

2021-01-30 11:42:53

迭代器代码元素

2018-02-13 14:48:17

戴尔

2022-02-06 00:07:19

互联网失业职业

2022-10-26 07:39:36

MVCC数据库RR

2023-05-31 16:22:36

人工智能AI

2022-07-06 10:33:39

技术债务CIO

2019-12-09 10:02:41

泛型ypeScript前端

2017-12-13 15:57:12

2021-06-24 09:08:34

Java代码泛型

2019-08-21 08:24:34

技术过滤器代码

2014-05-09 15:29:21

2020-11-16 11:24:00

Spring AOP数据库

2020-06-29 08:28:36

v-for 解构函数

2021-01-15 05:39:13

HashMapHashTableTreeMap

2021-09-07 17:42:16

人工智能AI

2021-02-22 13:14:00

计算机编程技术

2020-06-08 19:16:52

大数据IT技术

2019-08-08 16:00:08

HTTPGETPOST
点赞
收藏

51CTO技术栈公众号