14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
一致性读意味着 InnoDB 使用多版本来实现一个查询数据库的快照在某个时间点。
查看看到的事务做出的改变被提交了在那个时间点前, 随后没有改变或者没有提交的事务。
这个例外是这个规则是查询看到的改变通过早期的语句在相同的事务里,
这个列外导致下面的异常:
如果事务隔离级别是REPEATABLE READ (the default level),所有一致性读在相同的事务 读取通过第一次这样的读在事务里创建的快
照。
你也可以得到一个更新鲜的快照对于你的查询通过提交当前的事务然后执行新的查询
在 READ COMMITTED isolation level, 每个一致性读在一个事务里设置和读它自己的新鲜的快照
一致性读是默认的模式 InnoDB 处理SELECT 语句在 READ COMMITTED and REPEATABLE READ isolation levels.
一个一致性读不设置任何锁在它访问的表上, 因此其他会话可以同时的修改那些表
假设你运行模拟的事务隔离(RR) 当你执行一个一致性读(即,一个普通的SELECT 语句)
InnoDB 给你的事务一个时间点 根据这个你看的查看看到的数据库
如果其他的事务删除一个记录和提交在你的时间点被分配后,
你不会看到已经被删除,插入和修改的记录
注意:
数据库的快照状态应用于SELECT 语句在一个事务里, 未必对于DML语句。
如果你插入或者修改一些记录然后提交那个事务,一个DELETE 或者UPDATE语句从另外的并发RR事务被执行可能影响
那些提交的行,即使session 不能查看他们。
你可以提前你的时间点通过提交你的事务,然后做另外一个 SELECT or START TRANSACTION WITH CONSISTENT SNAPSHOT.
在下面的例子,Session A 看到SESSION B插入的记录只有当B已经提交了插入,而且A也提交了,
如果你想看到数据库的最新状态,使用RC隔离级别或者锁定读
在READ COMMITTED isolation level下,每个一致性读使用一个事务设置和读取它自己最新鲜的快照。
一致性读 不支持某些DDL语句:
1.一致性读不支持DROP table,因此MySQL 不能使用一个表已经被删除了
2.