当前位置: 首页 > news >正文

事务的原理、MVCC的原理

事务特性

数据库事务具有以下四个基本特性,通常被称为 ACID 特性:

  1. 原子性(Atomicity):事务被视为不可分割的最小工作单元,要么全部执行成功,要么全部失败回滚。这意味着如果事务执行过程中发生了错误,所有的修改都将被回滚,数据库状态将回到事务执行前的状态。

  2. 一致性(Consistency):事务执行前后,数据库从一个一致性状态转换到另一个一致性状态。事务的执行不会破坏数据库的完整性约束,例如主键、外键约束等。数据库会保持数据的完整性和一致性。

  3. 隔离性(Isolation):每个事务的操作都相互隔离,一个事务的中间结果对其他事务是不可见的。这意味着一个事务的修改在提交之前对其他事务是不可见的,防止了并发事务之间的相互影响,保证了数据的正确性。

  4. 持久性(Durability):一旦事务提交成功,对数据库的修改就会永久保存,即使系统故障或崩溃也不会丢失。数据库会将事务的结果持久化到非易失性存储器中,以保证即使系统发生故障,数据也不会丢失。

这些特性确保了数据库事务的可靠性和稳定性。它们是数据库管理系统中设计用于支持可靠性和并发控制的重要概念。通过保证事务具有这些特性,数据库可以提供稳定、可靠、高效的数据管理和处理能力。

事务的隔离级别

事务的隔离性

事务完全的串行会严重的降低系统的吞吐量和资源利用率,仔细发现,引发事务一致性问题的根本原因在于多个事务访问了相同的数据,更合理的做法是,在某个事务访问某个数据时,对其他想要访问该数据的事务进行限制,当该事务提交后,其他事务才能继续访问这个数据

事务并发执行引发的一致性问题

脏读

一个事务读取了另一个未提交事务修改过的数据,意味着发生了脏读,脏读引发的事务一致性问题。T1事务读取了T2事务未提交的数据。
幻读和不可重复读是并发事务中可能出现的两种问题,它们在数据库事务隔离级别较低的情况下会更容易发生。它们之间的区别在于以下几点:

幻读(Phantom Read)

幻读指的是在同一个事务内多次执行同样的查询,但在查询中返回了不同的数据行的现象。这种情况通常发生在一个事务中插入数据后,另一个并发事务再执行相同的查询,发现结果集中出现了之前不存在的行。

不可重复读(Non-repeatable Read)

不可重复读指的是在同一个事务内多次执行同样的查询,但在查询中返回了不同的数据行的现象。与幻读不同的是,不可重复读是由于其他并发事务对数据进行了修改导致的。

总的来说,**幻读侧重于事务在查询中发现了之前不存在的数据行,而不可重复读侧重于事务在多次读取相同数据时发现数据被其他事务修改。**两者的根本区别在于幻读关注的是新增或者删除的数据行,而不可重复读关注的是已经存在的数据行发生了改变

SQL标准中的四种隔离级别

设置隔离级别的目的是,舍弃一部分隔离性换取一部分性能,SQL标准中的4个隔离级别:

隔离级别脏读不可重复读幻读
READ UNCOMMITTED允许允许允许
READ COMMITTED不允许允许允许
REPEATABLE READ不允许不允许允许
SERIALIZABLE不允许不允许不允许

MySQL中支持的4中隔离级别

MySQL中的默认隔离级别是:REPEATABLE READ
MySQL8查询事务隔离级别

SELECT @@GLOBAL.transaction_isolation;

修改隔离级别语句

set [global | session] transaction isolation level 隔离级别;

各种隔离级别适用的场景

  1. READ UNCOMMITTED (读未提交): 这个隔离级别适用于某些特定的报表查询场景,对数据的实时性要求非常高,而对数据一致性要求较低。例如,在某些实时监控系统中,可以使用读未提交隔离级别来获取最新的数据,即使数据可能尚未被完全提交。

  2. READ COMMITTED (读已提交): 这个隔离级别适用于大多数在线交易处理系统(OLTP),如电子商务网站。在这种场景下,用户只需要读取已经提交的数据,以避免看到其他事务未提交的数据。一个典型的例子是在线购物系统中的库存管理,确保每个用户看到的库存数据是准确的。

  3. REPEATABLE READ (可重复读): 这个隔离级别适用于某些需要对数据进行长时间读取或计算的场景,比如报表生成或复杂的分析。在这些情况下,确保事务在执行期间不受其他事务的影响是非常重要的,以避免数据不一致性。例如,某些财务报表的生成过程中,需要保证数据的完整性和一致性。

  4. SERIALIZABLE (可串行化): 这个隔离级别适用于某些极端要求数据完全一致性的场景,如金融交易系统。在这种系统中,任何数据的不一致性都可能导致严重的后果。因此,确保所有事务按顺序逐个执行是至关重要的,即使在高并发情况下也要保证数据的完整性。

MVCC原理(多版本并发控制)

版本链

在InnoDB存储引擎中的表,聚簇索引中的记录都包含两个隐藏列,
trx_id: 一个事务都某条聚簇索引记录进行修改时,都会把该事务的事务id赋值给trx_id
roll_pointer: 每次对聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中,相当于一个指针,通过它可以找到该记录修改前的信息
image.png

ReadView(读视图)

用READ UNCOMMITTED 隔离级别的事务来说,可以读取未提交事务修改的记录,因此直接读取版本链中的最新版本就可以了;对于SERIALIZABLE隔离级别的事务来说,InnoDB中使用加锁的方式访问记录,对于READ COMMITED和REPEATABLE READ隔离级别的事务来说,都必须保证读到的记录是已经提交的事务修改过的记录,因此核心问题就是:需要判断版本链中的哪个版本对于当前事务是可见的,InnoDB给出的解决方案是,生成ReadView,ReadView包含下列四个重要内容:

m_ids:生成ReadView时,当前系统中活跃的事务id列表

min_trx_id:m_ids中的最小事务id

max_trx_id:在生成ReadView时,系统分配个下一个事务的事务id(max_trx_id+1)

creator_trx_id:生成该ReadView的事务的事务id

生成了ReadView之后,我们就可以借助它来判断当前版本的记录对当前事务是否可见:

  • 如果当前记录的trx_id与creator_trx_id相同,意味着当前事务在访问自己修改过的记录,可以访问
  • 如果当前记录的trx_id小于min_trx_id,说明生成该版本记录的事务已经提交了,可以访问
  • 如果当前记录的trx_id 大于max_trx_id,说明生成该版本的事务在当前事务生成ReadView之后才开启,所以该版本不可以被当前事务访问
  • 如果被访问版本的trx_id 在 min_trx_id 和 max_trx_id之间,则需进一步判断trx_id是否在m_ids列表中,如果在说明事务为提交,该版本不可见,如果不在,说明可见

在MySQL中,READ COMMITED和REPEATABLE READ 隔离级别之间一个非常答的区别就是他们生成ReadView的时机不同

READ COMMITED 每次读取数据前都生成一个ReadView

例如,现在系统中有两个事务id为T100,T200的事务正在执行,T80是已经提交的事务。100的事务修改a=1,200的事务修改a=2,下面是表信息,其中第一行索引中的记录。

idatrx_idroll_point
11100100
1110080
1080

假设现在有一个使用READ COMMITED隔离级别的新事物开始执行:
执行语句为

select a from t where id=1;

select语句执行过程如下:

  • 执行select语句时生成一个ReadView,m_ids列表为[100,200],min_trx_id为100,max_trx_id为201,creator_trx_id为0

因为这个新开启的事务只进行了select操作,并没有对记录进行修改,所以系统没有为其分配事务id,默认为0

  • 顺序版本链寻找符合要求的版本,返回的是a为"0"的版本

之后,将事务id为100的事务提交事务 200 事务中更新表 hero number 的记录

update t set a = "2" where id=1

然后再到刚才使用 READ COMMITTED隔离级别的事务执行select语句,继续查找number为1 的记录,执行步骤如下:

  • 生成ReadView,m_ids列表[200],min_trx_id为200,max_trx_id为200,creator_trx_id为0
  • 顺序版本链,查找符合要求的版本,最终返回的是"1"

REPEATABLE 在第一次读取数据时生成一个ReadView

假设现在有一个使用 REPEATABLE READ 隔离级别的新事务开始执行:
第一次select操作时:

  • 生成ReadView,执行select语句时生成一个ReadView,m_ids列表为[100,200],min_trx_id为100,max_trx_id为201,creator_trx_id为0
  • 找到符合条件的版本"0"

之后将事务id为100的事务提交后,再到事务id为200的事务中更新表中id为1的记录
然后再次执行select:

  • 沿用(或者说复制)第一次select时生成的ReadView
  • 最终的返回版本还是"0"

总结,在REPEATABLE READ隔离级别下,事务的两次查询结果是一样的,因此可以说在REPEATABLE READ级别下避免了不可重复读的发生,同时也很大程度上避免了幻读的发生

MVCC小结

所谓的MVCC指的就是在使用READ COMMITED 和 REPEATABLE READ这两种隔离级别的事务在执行select操作时,访问记录版本链的过程,这样可以使不同事务的读-写操作并发执行,从而提升系统性能。READ COMMITED 和 REPEATABLE READ的最大区别在于,生成Read View的时机不同,READ COMMITED 每次执行select前都会生成一个新的ReadView,而REPEATABLE READ只在第一次执行select前生成一个ReadView

相关文章:

事务的原理、MVCC的原理

事务特性 数据库事务具有以下四个基本特性,通常被称为 ACID 特性: 原子性(Atomicity):事务被视为不可分割的最小工作单元,要么全部执行成功,要么全部失败回滚。这意味着如果事务执行过程中发生…...

Golang反射原理

Golang反射原理 Go语言中的反射机制是通过标准库中的reflect包实现的。反射允许程序在运行时检查变量的类型和值,甚至可以修改变量的值。以下是反射的基本原理和使用方法: 基本原理 类型和种类: 反射中的类型信息通过reflect.Type表示&…...

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数(Lagrange function)通常用于优化问题,尤其是带有约束的优化问题。其一般形式为: 其中: f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…...

嵌入式linux跨平台基于mongoose的TCP C++类的源码

嵌入式linux开发中,需要使用http服务器时,mongoose是个很好的选择,linux,win双平台都支持,代码全开放,简单明了,我非常喜欢这种尽在撑控中的感觉(关于mongoose实现一个小型的http服务…...

入驻商家必看:如何在TikTok实现多店铺高效上货及运营?

TikTok作为跨境电商平台之一,越来越多人进入其电商赛道——TikTok Shop,运营者想要长远发展,了解平台的政策动向并进行调整店铺至关重要。本文整理了TikTok Shop降低入驻门槛的资讯,并为广大TikTok电商运营者提供实用、有效的开店…...

spring-boot-starter-data-redis

一、几个依赖的关系 在spring与redis整合时有下面几种: spring-boot-starter-data-redis spring-boot-starter-redis spring-data-redis 其中,spring-boot-starter-data-redis和spring-boot-starter-redis中都包含有spring-data-redis, 现在…...

科研绘图神器:机制图、模式图有哪些好用的工具推荐?

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 最近不少学员在问科研绘图相关的问题。前面娜姐介绍过AI辅助绘图的方法和思路: 顶刊的图文摘要Graphical Abstract,如何巧用AI绘制? 目前…...

DIFFUSIONSAT: A GENERATIVE FOUNDATION MODEL FOR SATELLITE IMAGERY(2024-ICLR)

论文:DIFFUSIONSAT: A GENERATIVE FOUNDATION MODEL FOR SATELLITE IMAGERY(2024-ICLR) 习惯用飞书做笔记了,大家见谅 Diffusionsat:卫星图像生成基础模型...

文件中台与安全:集成方案的探索与实践

在企业数字化转型加速的今天,文件中台已成为支撑数据共享与高效协作的关键基础设施。然而,随着企业文件需求的增多和内容复杂性的提升,文件的安全问题也日益突显。如何在构建强大文件中台的同时,保障文件数据的安全性,…...

Redis 哨兵 总结

前言 相关系列 《Redis & 目录》《Redis & 哨兵 & 源码》《Redis & 哨兵 & 总结》《Redis & 哨兵 & 问题》 参考文献 《Redis的主从复制和哨兵机制详解》《Redis中的哨兵(Sentinel)》《【Redis实现系列】Sentinel自动故…...

Systemd 和 Systemctl命令详解

Systemd 和 Systemctl命令详解 在现代 Linux 系统中,systemd 是一种高度灵活且广泛应用的系统管理工具。它主要负责系统引导和进程管理,支持并行化启动服务,并提供高级的服务管理和依赖控制。systemctl 是 systemd 的核心命令行工具&#xf…...

基于Multisim的音频放大电路设计与仿真

基本设计要求:设计并仿真实现一个音频功率放大器。功率放大器的电源电压为+5V(电路其他部分的电源电压不限),负载为8Ω电阻。具体要求如下:1)3dB通频带为300~3400Hz,输出…...

这是一款专门为SQL新手小白量身定制的工具!

首先!它永久免费!SQLynx对于个人用户和教育从业者永久免费!且真正实现了跨平台操作!支持Windows Linux和Mac,无需任 何安装和配置,更支持国产操作系统,如银河 麒麟统信等。 功能直观&#xff01…...

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)没几天,又来一个新的,真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)https://blog.csdn.ne…...

Android Input的流程和原理

Android Input事件机制 Android系统是由事件驱动的,而Input是最常见的事件之一,用户的点击、滑动、长按等操作,都属于Input事件驱动,其中的核心就是InputReader和InputDispatcher。InputReader和InputDispatcher是跑在system_serv…...

InfiMM-WebMath-40B——利用由 24 亿数学文档组成的数据集提高 LLM 的数学性能

1. 前言 论文地址:https://arxiv.org/abs/2409.12568 本文提出了一个新的大规模多模态预训练数据集 InfiMM-WebMath-40B,以提高数学推理能力。该数据集包含 24 亿个科学和数学相关的网络文档、85 亿个图片 URL 和约 400 亿个文本标记。该数据集支持多模…...

Swarm-LIO: Decentralized Swarm LiDAR-inertial Odometry论文翻译

文章目录 前言一、介绍二、相关工作三、方法A. 问题表述B. 框架概述C. 群体系统的初始化D. 去中心化激光雷达-惯性状态估计 四. 实验A. 室内飞行B. 退化环境飞行C. 去中心化部署 五. 结论和未来工作 前言 原文:原文 准确的自我状态和相对状态估计是完成群体任务的关…...

第十八章 Vue组件样式范围配置之scoped

目录 一、引言 二、案例演示 2.1. 工程结构图 2.2. 核心代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. BaseOne.vue 2.2.4. BaseTwo.vue 2.3. 运行效果 2.4. 调整代码 2.4.1. BaseTwo.vue 2.4.2. 运行效果 三、scoped原理 一、引言 前面的几个章节在介绍组件的时…...

【JavaScript】JavaScript 进阶-3-编程思想构造函数原型(更新中)

目录 编程思想构造函数原型 编程思想 构造函数 原型...

头歌网络安全爬虫

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2020/4/8 8:19 # File : info.py # ---------------------------------------------- # ☆ ☆ ☆ ☆ ☆ ☆ ☆ # >>> Author : Alex # >>> QQ : 2426671397 # >>> Mail…...

如何使用Dagster Pandera进行数据结构与质量的运行时检查

如何使用Dagster Pandera进行数据结构与质量的运行时检查 【免费下载链接】dagster Dagster是一个用于构建、部署和监控数据管道的应用程序框架,通过其强大的元编程能力,组织起复杂的数据流水线,确保数据的可靠性和一致性。 项目地址: http…...

如何自定义Micro终端编辑器的插件版本更新通知设置

如何自定义Micro终端编辑器的插件版本更新通知设置 【免费下载链接】micro A modern and intuitive terminal-based text editor 项目地址: https://gitcode.com/gh_mirrors/mi/micro Micro是一款现代化且直观的终端文本编辑器(A modern and intuitive termi…...

Bidili Generator效果展示:跨文化元素融合——敦煌壁画风格×未来科技感生成

Bidili Generator效果展示:跨文化元素融合——敦煌壁画风格未来科技感生成 1. 引言:当千年壁画遇见未来科技 想象一下,如果敦煌壁画里的飞天仙女,手持的不是琵琶,而是发光的能量武器;如果壁画中的祥云瑞兽…...

零基础部署MedGemma-X:5分钟搭建你的AI影像诊断助手

零基础部署MedGemma-X:5分钟搭建你的AI影像诊断助手 1. 为什么选择MedGemma-X? 1.1 传统影像诊断工具的局限性 在医疗影像诊断领域,医生们长期面临着效率与准确性的双重挑战。传统计算机辅助诊断(CAD)系统往往只能提…...

Uniapp小程序微信登录实战:FastAPI后端如何安全处理AppSecret和session_key

Uniapp小程序微信登录实战:FastAPI后端安全架构设计指南 在移动互联网时代,微信小程序已成为企业服务用户的重要入口。根据腾讯2023年财报显示,微信小程序日活跃用户突破6亿,年交易额增长超过40%。在这样的背景下,如何…...

避坑指南:CentOS8配置本地yum源时最容易忽略的5个细节(含ISO校验/fstab配置)

CentOS8本地yum源配置深度避坑手册:从ISO校验到持久化挂载的完整实践 在Linux系统管理领域,配置本地yum源看似基础却暗藏玄机。特别是当CentOS8停止官方维护后,许多企业转向本地镜像源方案。但据社区统计,超过60%的配置失败案例源…...

027_Mrs Smith s living room

Lesson 27: Mrs. Smith’s living room Watch the story and answer the question Where are the books? The books are on the stereo.Key words and expressions living room 客厅 meeting room 会议室dining room 饭厅 near prep. 靠近window …...

从零搭建个人语料库:比收藏Prompt重要10倍的AI提升秘籍

文章指出,影响AI输出质量的关键并非Prompt技巧,而是底层语料库的建设。作者详细阐述了个人语料库的三层结构(高质量输入、标准化处理、反馈闭环),并提供了从收集、清洗到向量化、使用的实操步骤。强调通过积累和整理个…...

统信UOS系统故障排查:从黑屏报错到硬盘修复的完整指南

1. 统信UOS黑屏报错问题解析 最近有不少用户反馈统信UOS系统开机时遇到黑屏问题,屏幕上显示"failed to register hotplug callbacks"、"hda no chx001 device"和"CORBRP0"等错误信息。这种情况通常会让用户感到困惑:到底是…...

Z-Image-Turbo-辉夜巫女服务监控与维护:基础运维命令与日志分析

Z-Image-Turbo-辉夜巫女服务监控与维护:基础运维命令与日志分析 部署好一个AI图像生成服务,比如Z-Image-Turbo-辉夜巫女,只是第一步。让它稳定、高效地跑起来,才是真正考验的开始。服务会不会突然卡住?生成图片的速度…...