可重复读
在可重复读隔离级别下,事务T启动的时候会创建一个视图 read-view,之后事务T执行期间,即使有其他事务修改了数据,事务T看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争。
在Mysql里,有两个视图的概念。
1:一个是view,他是一个用来查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法create view ...,而它的查询方法与表一样。 2:innodb在实现MVVC时用到的一致性读视图,即consistent read view,用于支持RC和RR隔离级别的实现。
快照在MVCC里是怎么工作的
在可重复读隔离界别下,事务在启动的时候就会“拍了个快照”。注意,这个快照是基于整个库的。 innodb里面每个事务都有一个事务ID,叫做transaction_id。它是在事务开始的时候向innodb的事务系统申请的,是按照申请顺序严格递增的。 每行数据也都有多个版本的。每次事务更新数据的时候,都会生成一个新的数据版本,并且把transaction_id赋值给这个数据版本的事务id,记作row trx_id。同时,旧的数据版本要保留,并且在新的数据版本中,能够有的信息直接拿到。
也就是说,数据表中的一行记录,其实可能有多个版本(row),每个版本都有自己的row trx_id。
在实现上,innodb为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在活跃的所有事务id。活跃是的就是,启动但是没有提交。 数组里面事务id的最小值记为低水位,当前系统里面已经创建过的事务id的最大值加一记为高水位。 这回视图数组和高水位,就组成了当前事务的一致性视图。 而数据版本的可见性规则,就是基于数据row trx_id和这个一致性视图的对比结果看到的。 是这个视图数组所有的row trx_id分成了集中不同的情况。