MVCC (Multi-Version Concurrency Control 多版本的并发控制协议)

简介

MVCC,多版本并发控制协议:顾名思义就是每个记录有多个版本,从而实现以下功能:

  1. Innodb的MVCC能防止幻读的发生。(不是每个MVCC都可以,看MVCC怎么实现)
  2. 实现了多个事务并发下,读操作的非阻塞。

实现原理

数据结构

隐藏列

InnoDB中每行数据都有两个隐藏列,一个保存了行的事务ID(DB_TRX_ID),一个保存了行的回滚指针(DB_ROLL_PT)。每开始一个新的事务,都会自动递增产生一个新的事务id。事务开始时刻的会把事务id放到当前事务影响的行事务id中,当查询时需要用当前事务id每行记录的事务id进行比较。

数据的历史版本就是不同事务修改数据的过程事务id,这个过程不一定是递增或者递减的

基于undo log的版本链

前面说到每行数据的隐藏列中包含了指向undo log的指针,而每条undo log也会指向更早版本的undo log,从而形成一条版本链。

ReadView

通过隐藏列和版本链,MySQL可以将数据恢复到指定版本;但是具体要恢复到哪个版本,则需要根据ReadView来确定。所谓ReadView,是指事务(记做事务A)在某一时刻给整个事务系统(trx_sys)打快照,将所有正在活跃的事务id放到数组中,之后再进行读操作时,会将读取到的数据中的事务idtrx_sys快照比较,从而判断数据对该ReadView是否可见,即对事务A是否可见。

ReadView

RU(READ UNCOMMITTED)和SERIALIZABLE

对于 RU(READ UNCOMMITTED)隔离级别下,所有事务直接读取数据库的最新值即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值