对mvcc的理解

2021-04-07  本文已影响0人  zcxzcxczcx

1、mysql事务特性

原子性、一致性、持久性、隔离性

2、事务隔离的级别

因为事务隔离会出现脏读、不可重复读、换读的问题,为了解决这些问题,事务的隔离有四个级别:读未提交、读提交、可重复读、串行化。其中的读提交和可重复读级别背后的实现用到的就是mvcc。

3、mvcc

mvcc(Mutil-Version Concurrency Control),多版本并发控制指的是 “维持一个数据的多个版本,使得读写操作没有冲突” 。

4、mvcc实现原理

mvcc的实现主要有三部分构成:记录的隐式字段、undolog、视图。

a、记录的隐式字段

DB_TRX_ID:记录创建这条记录/最后一次修改该记录的事务ID

DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本

DB_ROW_ID:隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引

实际还有一个删除flag隐藏字段, 既记录被更新或删除并不代表真的删除,而是删除flag变了

b、undolog

c 、视图

事务在进行快照读的时候产生的快照图,即视图。在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID。我们可以把Read View简单的理解成有三个全局属性:

trx_list:一个数值列表,用来维护Read View生成时刻系统正活跃的事务ID

up_limit_id:记录trx_list列表中事务ID最小的ID

low_limit_id:ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1

Read View遵循的可见性算法

比如事务1生成视图,取到视图中的DB_TRX_ID,如果DB_TRX_ID小于up_limit_id,则该视图对于事务1可见(注:事务1处于trx_list中)。如果大于low_limit_id,则该视图对于事务1不可见。如果在trx_list区间,但是在trx_list找得到,则说明事务DB_TRX_ID还没有提交,该视图对于事务1不可见。如果在trx_list区间,但是在trx_list找不到,则该视图对于事务1可见。

d、当前读、快照读的定义

当前读:就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁

快照读:不加锁的非阻塞读

e、RR是如何在RC级的基础上解决不可重复读的?

在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。

上一篇下一篇

猜你喜欢

热点阅读