事务原理,以及MVCC如何实现RC,RR隔离级别的

embedded/2024/10/9 2:39:25/

事务原理

 redo log 保持持久性:

首先原来的情况是我们做一组操作的时候,先去操作bufferpool缓冲区,如果没有,那么后台线程将数据页换入换出到缓冲区,然后我们对这个buffer pool进行修改,为脏页,在写回磁盘的时候宕机了,那么不能保证持久性了,所以引出了redolog

redo log 在这里出现就是将更新的操作立马更新到redologbuffer中,然后等事务提交的时候,那么直接将redologbuffer的文件写回追加到磁盘的 log文件中,实现持久化。这样下次bufferpool中的脏页写回也不担心宕机了

undo log实现原子性

undolog记录的是逻辑日志,redolog记录的是物理日志;

实现原子性就是,当我们delete一条数据的时候,undolog会存有对应的一条insert数据,当执行rollback的时候,就可以从undolog中读取相应的内容进行回滚;保证原子性

mvcc和锁实现隔离性

基本概念:

当前读:执行当前读的时候,读取的是最新的数据版本;

快照读:就是事务读取的是事务开始的版本,有可能是旧版本,RR级别就是这个快照读

原来的两个事务其中一个修改了表的数据,然后另一个是读取不到的,因为事务的隔离级别为RR可重复读,然后我们加了个共享锁,或者是一下排他锁就变成了当前读,就可以读到最新的版本数据了

MVCC:

隐藏字段:事务id,回滚指针(指向上一个版本的事务),隐藏主键

undo log

readview

读已提交的隔离级别:每次执行快照读的时候生成Readview;

可重复读:仅在第一次执行快照读时生成readview,后续都用这个Readview;

MVCC实现原理:

1. 隐藏字段

每一行记录在数据库中(如MySQL InnoDB)都有两个隐藏字段:

  • trx_id(创建事务ID):记录该行是由哪个事务插入或更新的,用于标识哪个事务创建或修改了这个版本的数据。
  • roll_pointer(指向undo log):指向undo log中的前一个版本的记录,形成一个版本链。

这两个字段帮助维护数据的多个版本,在读取时通过这些字段判断数据版本是否可见。

2. undo log版本链

每次对数据行进行更新操作时,并不会直接覆盖数据,而是将旧版本数据保存在undo log中,并且利用roll_pointer指向前一个版本的数据,形成一个版本链。这些旧版本数据存储在undo log中,并可以通过回滚操作恢复或者进行历史版本读取。

undo log版本链允许在并发事务中查询过去某个时刻的数据库状态,而不影响当前正在进行的事务。每个事务可以通过遍历这个版本链来找到符合其可见性规则的数据版本。

3. readview

readview是MVCC在执行查询时创建的一致性视图,它用于决定当前事务能够看到哪些数据版本。readview中保存了当前正在活跃的事务列表,以及当前事务的ID。这个视图确定了当前事务可以看到哪些数据版本,避免读取到其他未提交事务的更改。

关系:
  • trx_id记录了数据的创建时间(以事务为单位),可以通过它来判断某个版本的数据是否是当前事务或其他事务创建的。
  • undo log版本链用于保存历史版本,并通过roll_pointer串联成链,回溯出需要的历史数据版本。
  • readview则是事务在执行查询时生成的,帮助决定当前事务可以看到哪些版本的记录。

MVCC如何实现隔离级别

1. 可重复读(Repeatable Read)

可重复读隔离级别下,数据库为每个事务生成一个固定的readview,该视图在事务开始时创建,并在整个事务期间保持不变。通过readview的规则,每次查询时事务都只会看到在事务开始时已经提交的版本。

具体流程:

  • 当事务开始时,系统生成一个readview,记录当前系统中活跃的事务ID列表。
  • 读取数据时,通过遍历undo log版本链,根据数据的trx_id判断当前事务是否能看到某个版本:
    • 如果数据的trx_id小于当前readview生成时的最小活跃事务ID(即数据在事务开始前已经提交),则该版本可见。
    • 如果数据的trx_id大于当前readview中的最大事务ID,说明这个版本是在当前事务之后创建的,不可见。
    • 如果trx_id在活跃事务列表中,说明该事务还未提交,数据不可见。
  • undo log中的每个版本根据以上规则遍历,找到第一个可见的版本进行返回。

通过这种机制,即使其他事务在当前事务执行期间对数据做了修改,当前事务也只会读取到事务开始时的数据版本,实现了可重复读

2. 读已提交(Read Committed)

读已提交隔离级别下,数据库在每次执行SELECT语句时都会生成一个新的readview。这意味着,每次查询都会看到最近已经提交的版本数据,而不必像可重复读那样锁定在事务开始时的版本。

具体流程:

  • 在每次查询时,数据库生成一个新的readview,包含当前活跃的事务ID列表。
  • 根据与可重复读相同的判断规则,遍历undo log版本链,查找当前readview下可见的数据版本。
  • 因为readview是每次查询都生成的,因此每次查询都会看到最新已提交的数据,从而允许事务在执行期间读取到其他事务已经提交的更新数据。

总结:

  • 隐藏字段存储了记录的事务ID和回滚指针,决定了当前版本的记录由哪个事务修改,并提供了回溯历史版本的路径。
  • Undo Log 记录了历史版本数据,并通过 roll_pointer 构建版本链,确保事务可以基于不同的 ReadView 回溯到合适的历史版本。
  • ReadView 决定了当前事务在读取时能看到哪些事务提交的版本数据。在 可重复读 下,ReadView 在事务启动时生成并固定,而在 读已提交 下,每次读取都会创建新的 ReadView。

http://www.ppmy.cn/embedded/124835.html

相关文章

计算机网络:物理层 —— 信道复用技术

文章目录 信道信道复用技术信道复用技术的作用基本原理常用的信道复用技术频分复用 FDM时分复用 TDM波分复用 WDM码分复用 CDM码片向量基本原理 信道 信道是指信息传输的通道或介质。在通信中,信道扮演着传输信息的媒介的角色,将发送方发送的信号传递给…

面试题:Redis(二)

1. 面试题 2. MoreKey案列 事故案例 2.1 生成上如何限制key*/flushdb/flushall等危险命令的使用? 通过redis.conf配置文件中在SECURITY选项中禁用这些命令 2.2 不用key*避免卡顿那用什么? 用scan命令,类似mysql中的limit命令 语法&…

【计算机网络】Tcp/IP五层协议,Udp报文组成,Udp与Tcp的区别

Tcp/IP五层协议 TCP/IP模型是计算机网络的核心协议之一,通常被分为五层,每一层都有其独特的功能和作用。以下是TCP/IP模型的五层协议的简要描述: 物理层:这一层涉及实际的物理连接,定义了硬件传输介质的特性&#xff…

低代码时代的企业信息化:规范与标准化的重要性

在当今数字化转型的浪潮中,企业的信息化建设正逐步向低代码平台倾斜。低代码不仅仅是简化开发过程,更是对企业内部流程、规范和标准化的深刻理解与应用。本文将探讨低代码在企业信息化中的重要性,特别是在运维和开发流程中的标准化&#xff0…

①EtherCAT转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherCAT 转 ModbusTCP GW系列型号 MS-GW15 简介 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关,为用户提供一种 …

【面向对象】设计模式概念和分类

零.前提提要 本文章是我考中级软件设计师时的笔记,基本都是一些自己的思路和见解,现记录一下,希望可以帮助到即将考证的同学。 一.面向对象设计模式的概念 二.面向对象的设计模式分类 设计模式确定了所包含的类和实例、他们的角色和写作方式以…

PHP安装后Apache无法运行的问题

问题 按照网上教程php安装点击跳转教程,然后修改Apache的httpd.conf文件,本来可以运行的Apache,无法运行了 然后在"C:\httpd-2.4.62-240904-win64-VS17\Apache24\logs\error.log"(就是我下载Apache的目录下的logs中&am…

OpenAI Sora如何使用?

引言:OpenA推出首款AI视频模型Sora,震惊世界! Sora是什么? Sora是OpenAI最新发布的文本生成视频(Text to Video)大模型,能生成长达60秒的视频 Sora能够创造出包括多个角色、特定动作类型以及…