MySQL中的MVCC

MVCC(Multiversion Concurrency Control),即多版本并发控制,其最大的好处是读不加锁,有效地提高了并发性,同时还保障了事务的隔离性

InnoDB中利用MVCC解决了幻读问题。

一、MVCC的实现原理

  • MVCC 的实现基于 两个隐藏字段 undo log Read View

MVCC与undo log的关系

MVCC与undo log的关系举例
对记录每次更新后,都会将旧值放到一条 undo 日志中,成为该记录的一个旧版本,所有的版本被 roll_pointer 属性连接成一个链表,称为版本链

Read View

Read View的构成

  1. creator_trx_id: 创建该 Read View 的事务的 ID(只有涉及改动的事务才会记录 ID,只读的事务的 ID 默认为0)。
  2. trx_ids: 在生成该 Read View 时系统中活跃的读写事务的事务 ID 列表。
  3. up_limit_id: 活跃的事务列表中最小的事务的 ID。
  4. low_limit_id: 表示生成该 Read View 时系统中应该分配给下一个事务的 ID 值,即系统中现在最大的事务 ID。

Read View相当于是给当前的系统拍了一张“快照”。

Read View的规则

Read View的规则

MVCC的整体流程

MVCC 查询一条记录的流程:

  1. 首先获取事务自己的版本号,即事务 ID。
  2. 获取 Read View。
  3. 查询数据,然后与 Read View 进行比较。
  4. 如果不符合 Read View 的规则,则从 undo log 中获取历史快照。
  5. 最后返回符合规则的数据。

二、MVCC解决脏读、不可重复读与幻读

脏读

当隔离级别为读已提交(Read Committed) 时,一个事务中的每一次SELECT查询都会重新获取一次 Read View。
所以可以避免脏读,但是若 2 个SELECT的 Read View 不同,就会产生不可重复读或幻读。

不可重复读与幻读

当隔离级别为可重复读(Repeatable Read) 时,一个事务只在第一次SELECT时获取一次 Read View,后面所有的SELECT都用这个 Read View。
所以可以避免不可重复读;同时SELECT查出的数据需要依次与 Read View 进行比较,如果后面的SELECT查出的数据中有新插入的记录,那么在根据 Read View 比较的时候就会发现其 trx_id trx_ids 列表中或大于等于 low_limit_id ,进而会被丢弃,所以可以避免幻读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZBH4444

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值