一个一致的阅读意味着InnoDB
使用多版本的当前查询数据库的快照时间点。查询看到的变化由事务提交之前的时间点,和由后任何更改或未提交的事务。例外的是查询看到早些时候做出的更改声明在同一事务。这个异常会导致以下异常:如果你更新表中的行,选择
看到最新版本的更新的行,但它也可能会看到老版本的任何行。如果其他会话同时更新同一个表,异常意味着你可能会看到表在数据库中不存在。
如果事务隔离级别是可重复读取
(默认级别),同一事务中的所有一致的读取快照等建立了第一个读过的事务。你可以得到一个新鲜的快照查询之后提交当前事务和发行新查询。
与读过承诺
隔离级别,每个一致读事务内设置和读取自己的新鲜的快照。
一致的阅读是默认的模式InnoDB
流程选择
语句读过承诺
和可重复读取
隔离级别。一致的阅读不设置任何锁表的访问,因此其他会话可以自由修改那些表在同一时间执行一致的阅读时在桌子上。
假设您正在运行在默认可重复读取
隔离级别。当你发出一致的阅读(也就是一个普通的选择
声明),InnoDB
给你交易的计算根据查询数据库。如果另一个事务删除一行并提交你的计算分配后,您没有看到行被删除。插入和更新同样对待。
适用于数据库的快照状态选择
语句在事务,不一定DML语句。如果你插入或修改一些行,然后提交,事务,删除
或更新
从另一个并发发表声明可重复读取
事务可能会影响那些刚刚承诺行,即使会话无法查询。如果一个事务更新或删除行犯下另一个事务,这些变化对当前事务变得可见。例如,您可能会遇到一个情况如下:
选择计数(c1)从t1 c1 =“xyz”;——返回0:没有行匹配。删除从t1 c1 =“xyz”;——删除几行最近犯下的其他事务。选择计数(c2)从t1 c2 = ' abc ';——返回0:没有行匹配。更新t1组c2 = ' cba '在c2 = ' abc ';——影响10行:“abc”的另一个公司只承诺10行值。选择计数(c2)从t1 c2 =“cba”;——返回10:这个时候可以看到行只是更新。
你可以提前计算提交事务,然后做另一个选择
或开始事务一致的快照
。
这就是所谓的多版本并发控制。
在下面的例子中,会话将行插入到只有当B已承诺的插入和承诺,以便计算先进过去B的提交。
会议一个会话B组autocommit = 0;设置自动提交= 0;从t时间| SELECT *;|空集|插入t值(1、2);|从t v SELECT *;空集提交;SELECT * t;空集提交;SELECT * t;- - - - - - - - - - - - - - - - - - - - - - - - | 1 | 2 | - - - - - - - - - - - - - - - - - - - - - - - -
如果你想看到的”新鲜的”状态的数据库,使用读过承诺
隔离级别或读锁:
SELECT * t的份额;
与读过承诺
隔离级别,每个一致读事务内设置和读取自己的新鲜的快照。与为分享
,发生锁读:一个选择
块,直到事务包含最新鲜的行结束(见部分15.7.2.4,“锁定”)。
一致读不工作在一定的DDL语句:
一致的阅读不工作
删除表
,因为MySQL已经下降,不能使用一个表InnoDB
破坏了表。一致的阅读不工作
ALTER TABLE
操作,使一个临时复制的原始表和删除原始表当临时复制是建立。当你补发一个一致的阅读在一个事务中,新表中的行是不可见的,因为那些行不存在事务的快照。在这种情况下,事务返回一个错误:ER_TABLE_DEF_CHANGED
,”事务表定义发生了变化,请重试”。