MySQL原理--隔离级别的实现方式--MVCC

原文网址:MySQL原理--隔离级别的实现方式--MVCC_IT利刃出鞘的博客-CSDN博客

简介

本文介绍MySQL的隔离级别的实现方式--MVCC。

这也是Java后端面试题中常见的一个问题。

MVCC简介

MVCC(Multi-Version Concurrency Control),含义为:多版本并发控制。

在并发访问的时候,数据存在版本的概念,可以有效地提升数据库并发能力,常见的数据库如MySQL、MS SQL Server、IBM DB2、Hbase、MongoDB等等都在使用。

简单讲,如果没有MVCC,当想要读取的数据被其他事务用排它锁锁住时,只能互斥等待;而MVCC可以通过提供历史版本从而能够读取被锁的数据(的历史版本),避免了互斥等待。

在 MySQL中,MVCC是 InnoDB 存储引擎实现隔离级别的一种具体方式。

  • 未提交读:无需使用 MVCC(总是读取最新的数据行)
  • 提交读可重复读:使用MVCC来实现。
  • 可串行化:需要对所有读取的行都加锁,单纯使用 MVCC 无法实现。

MVCC一般有两种实现方式(本文所讲的InnoDB采用的是后者)

  1. 实时保留数据的一个或多个历史版本
  2. 在需要时通过undo log构造出历史版本

MVCC原理

说明

事务ID是在MySQL开启事务时为其分配的递增序列号,由于是递增的,所以可以基于此判断事务先后关系。

MVCC的多版本指的是针对数据库中的一行数据,都可能通过undo log中的数据算出多条行数据,每行数据版本不同(是为多版本),针对每次写操作,事务提交前,都会在undo log中记录相应的变动以及对应的事务ID,再结合数据表中的当前行数据,就可以回溯出一个行的的多个版本了。

Innodb会为每行数据添加两个字段 up_txid、del_txid,分别是更新事务ID、删除事务ID,事务新增或者更新一个数据行后,会将该事务ID记录在该行数据的up_txid中,事务删除行数据后,会将该事务ID记录在del_txid中。

read committed隔离级别下

和RR隔离级别一样的是,RC隔离级别下的查询也是快照读,区别就是RC隔离级别下每次SELECT时都会获取下当前活跃事务ID列表,然后从最新一行数据开始,判断是否满足如下条件,不满足则继续判断更旧的一行数据:

  1. 行数据的up_txid不在活跃事务ID列表中(表示已经提交)
  2. 行数据的del_txid为null,或者在活跃事务ID列表中未提交

也就是:每次都读取当前已经提交的并且未被删除的最新数据,相当于每次查询都会拍个快照。

上边只是部分内容,为便于维护,本文已迁移到此地址:MySQL隔离级别的实现方式-MVCC - 自学精灵

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT利刃出鞘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值