MVCC底层原理实现

MVCC的实现原理

了解实现原理之前,先理解下面几个组件的内容

1、 当前读和快照读

先普及一下什么是当前读和快照读。

当前读:读取数据的最新版本,并对数据进行加锁。

例如:insert、update、delete、select for update、 select lock in share mode。

快照读:读取数据的历史版本,不对数据加锁。

例如:select

最重要概念: MVCC原理是基于Undo Log、隐藏字段、Read View(读视图)实现的。

2、隐藏字段

MySQL的隐藏字段,当我们创建一张表时,InnoDB引擎会增加3个隐藏字段。

  • DB_TRX_ID(最近一次提交事务的ID):修改表数据时,都会提交事务,每个事务都有一个唯一的ID,这个字段就记录了最近一次提交事务的ID。
  • DB_ROLL_PTR(上个版本的地址):修改表数据时,旧版本的数据都会被记录到Undo Log日志中,每个版本的数据都有一个版本地址。这个字段记录的就是上个版本的地址。
  • DB_ROW_ID(隐藏主键):如果表中没有主键会默认生成该隐藏主键。
3、Undo log版本链

Undo log日志详解 :主要被用到了快照读这一个阶段


undo log版本链示意图:

过程:

  1. 第一次事务进行更新数据时候,首先会在 undo log版本链 记录原来数据的旧版本,以及该版本的指针,然后进行更新操作,此时会修改DB_TRX_ID为最近一次修改数据的事务ID,DB_ROLL_PTR指向上一次版本数据的指针,这样不断有事务更新该数据时候,表记录和 undo log 历史数据就组成了一个版本链。
4、Read View(读视图)

在事务中,执行SQL查询,就会生成一个读视图,它是快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务 id

快照读一般是读取的历史版本的读视图, 当前图 会生成一个最新版本的读视图。

读视图是基于下面几个字段实现的:

  • m_ids:当前系统中活跃的事务ID集合,即未提交的事务ID集合。

  • min_trx_id:m_ids中最小的ID

  • max_trx_id:下一个要分配的事务ID

  • creator_trx_id: 当前事务ID

读视图决定当前事务能读到哪个版本的数据,从表记录到 Undo Log 历史数据的版本链,依次匹配,满足哪个版本的匹配规则,就能读到哪个版本的数据,一旦匹配成功就不再往下匹配。

数据可见性规则:

当一个匹配可以访问该数据的时候就可以进行数据提取了,也就是直接返回查询数据

5、不同隔离级别下可见性分析

在不同的事务隔离级别下,生成读视图的规则不同:

READ COMMITTED(读已提交) :在事务中每一次执行快照读都生成一个读视图,每个读视图中四个字段的值都是不同的。

REPEATABLE READ(可重复读) :仅在事务中第一次执行快照读时生成读视图,后续复用这个读视图

相关推荐
一水鉴天4 分钟前
整体设计 之28 整体设计 架构表表述总表的 完整程序(之27 的Q268 )(codebuddy)
java·前端·javascript
net3m336 分钟前
雅特力单片机用串口USART_INT_TDE中断比用USART_INT_TRAC的 发送效率要高
java·开发语言·算法
雪碧聊技术7 分钟前
深入解析:Java中int类型转换为String类型的多种方法
java·整数转为字符串
是一个Bug12 分钟前
声明式事务:深度解析与实战指南
数据库·oracle
BD_Marathon17 分钟前
【JavaWeb】启动tomcat报错:启动子级时出错
java·tomcat
while(1){yan}18 分钟前
网络协议TCP
java·网络·网络协议·tcp/ip·青少年编程·电脑常识
laocooon52385788622 分钟前
C#二次开发中简单块的定义与应用
android·数据库·c#
不穿格子的程序员22 分钟前
Redis篇4——Redis深度剖析:内存淘汰策略与缓存的三大“天坑”
数据库·redis·缓存·雪崩·内存淘汰策略
一过菜只因23 分钟前
JavaWeb后端(spring--boot)
java·开发语言