MySQL的MVCC机制

在前面的文章中说到,MySQL的默认隔离级别为可重复读repeatable read,InnoDB存储引擎在这个默认的隔离级别下可以在一定程度上解决幻读的问题,那么它是如何做到的,本文将讲解InnoDB的MVCC多版本并发控制问题,MVCC是基于“数据版本”对并发事务进行访问的,MVCC应用在RC和RR两个隔离级别下。

实例介绍

图中一共有四个事务A,B,C,D,其中的tx_id是在事务开始时MySQL分配的事务编号。分别是1、2、3和4。其中前三个事务分别在不同的时间点更新数据然后提交,而第四个数据是在不同的时间对数据进行查询操作:第一次是在事务A提交后事务B提交之前查询,第二次是在事务B提交后事务C提交之前进行的查询操作,在不同的隔离级别下两次查询会出现不同的结果。
在这里插入图片描述
在这里插入图片描述
基于undo log的版本链:
在这里插入图片描述
TRX_ID代表最后一次更新时事务的编号,DB_ROLL_PTR指向本次数据更改之前的数据。
在这里插入图片描述

ReadView快照读 对应于当前读

在这里插入图片描述
在ReadView快照读的条件下会使用MVCC,而在当前读的条件下会使用nex_key_lock也就是行锁加上间隙锁。

快照读下的事务控制

ReadView是一个数据结构,包含四个字段

  1. m_ids:当前活跃的事务编号合集
  2. min_trx_id:最小活跃事务编号
  3. max_trx_id:预分配事务编号,单签最大事务编号+1
  4. creator_trx_id:ReadView创建者的事务编号

读已提交RC:在每一次执行快照读时生成ReadView
在这里插入图片描述
版本链数据访问规则:

  1. 判断当前事务id是否等于creator_trx_id?成立则说明这个事务自己更改的可以访问。
  2. 判断trx_id < min_trx_id?成立说明数据已经提交,可以访问
  3. 判断trx_id > max_trx_id成立说明事务是自ReadView生成以后才开启,不允许访问
  4. 判断min_trx_id <= trx_id <= max_trx_id,成立在m_ids数据中对比,不存在则代表数据已经提交,可以访问。
    在这里插入图片描述

可重复读条件下的MVCC

在这里插入图片描述
MVCC在一定程度上可以解决幻读的问题,但是不完全能解决幻读问题,因为它并没有采用锁的方式进行数据隔离。
在这里插入图片描述

补充:连续两个快照读中出现当前读不一定会出现幻读,得看当前读有没有覆盖到其他事务新增的数据,如果没的话,则不会出现幻读

ReadView重新生成的情况,依然出现了幻读的问题:
在这里插入图片描述

关于在当前读的情况下事务的隔离控制

占坑…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值