MySQL - 一致性读

2019/10/08

以下所有实验使用的版本为: MySQL 8.0

一致性读是什么?

A consistent read means that InnoDB uses multi-versioning to present to a query a snapshot of the database at a point in time.
The query sees the changes made by transactions that committed before that point of time, and no changes made by later or uncommitted transactions.

一致性读意味着InnoDB存储引擎使用多版本控制的方式显示某一时刻的数据库查询快照。
查询的结果是该时间节点之前提交的事务所做的修改,以后的就看不到了。


如何触发一致性读?

Consistent read is the default mode in which InnoDB processes SELECT statements in READ COMMITTED and REPEATABLE READ isolation levels.

很明显,当你使用InnoDB存储引擎,同时你的事务隔离级别是READ COMMITTEDREPEATABLE READ时,所有SELECT语句返回的结果都是一致性读。


一致性读有什么特殊场景?

The exception to this rule is that the query sees the changes made by earlier statements within the same transaction.

虽然说一致性读获得是某个时间节点对于数据库的查询快照,但在同一个事务内部,查询快照还是会发生改变的,我们来看个例子。


RR和RC隔离等级下的一致性读

接下来,我们来看下REPEATABLE READREAD COMMITTED事务隔离等级下关于一致性读的几种场景。

  • RR与RC隔离等级下,关于一致性读的区别是什么?

当事务A、B均处于REPEATABLE READ隔离等级,若A做了数据修改,等A提交后,B仍查询不到修改的数据。

可以在第9步看到,只有当Session12都提交后,才会Session2中查询到之前Session1中插入的新数据。


当事务A处于REPEATABLE READ,事务B处于READ COMMITTED事务等级时,若A做了数据修改,等A提交后,B是可以查询到修改的数据!

可以看到,当Session1第7步提交后,Session2第8步读取到了新的添加数据。

所以,总结下两种事务隔离等级下,关于一致性读的区别:

当事务A、B均为REPEATABLE READ等级时,当A修改完数据并提交后,B仍读取不到最新的数据。
当事务A是REPEATABLE READ,B是READ COMMITTED等级时,当A修改完数据并提交后,B可以读取到最新的数据。


  • 那么在RR隔离等级下,如何获得最新的查询快照?

第一种方式: Share Lock(共享锁)


第二种方式: Exclusive Lock(排它锁)


第三种方式: UPDATE, DELETE


参考


一位喜欢提问、尝试的程序员

(转载本站文章请注明作者和出处 姚屹晨-yaoyichen

Post Directory