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采用的是后者)
- 实时保留数据的一个或多个历史版本
- 在需要时通过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列表,然后从最新一行数据开始,判断是否满足如下条件,不满足则继续判断更旧的一行数据:
- 行数据的up_txid不在活跃事务ID列表中(表示已经提交)
- 行数据的del_txid为null,或者在活跃事务ID列表中未提交
也就是:每次都读取当前已经提交的并且未被删除的最新数据,相当于每次查询都会拍个快照。
上边只是部分内容,为便于维护,本文已迁移到此地址:MySQL隔离级别的实现方式-MVCC - 自学精灵
还没有评论,来说两句吧...