MySQL——事务、MVCC

目录

什么是事务?

事务的四大特性

事务的隔离级别

事务的原理

redo log

undo log

MVCC实现原理

概念

隐藏字段

undo log版本链

readview


什么是事务?

    事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要不同时失败。

    用一个形象的比喻:事务就像银行转账操作,从A账户扣款和向B账户加款这两个操作必须作为一个整体执行——要么都成功完成,要么都不执行。如果只执行了其中一个操作,就会导致数据不一致。

事务的四大特性

  • 原子性:事务是不可分割的最小操作单元,要么同时成功,要么同时失败。
  • 一致性:事务完成时,必须使所有的数据保持一致状态。
  • 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

事务的隔离级别

  • 读未提交(Read Uncommitted):事务可以读取其他未提交事务的修改。会导致脏读(Dirty Read)、不可重复读和幻读。

  • 读已提交(Read Committed):事务只能读取其他已提交事务的修改。解决了脏读,但仍可能存在不可重复读(Non-repeatable Read) 和幻读。这是Oracle等数据库的默认级别。

  • 可重复读(Repeatable Read):确保在同一事务中多次读取同一数据的结果是一致的。解决了脏读和不可重复读,但仍可能存在幻读(Phantom Read)。这是MySQL InnoDB的默认级别。

  • 串行化(Serializable):最高隔离级别,强制事务串行执行,完全避免脏读、不可重复读和幻读,但性能开销最大。

事务的原理

redo log

    重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性

    该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中,当事务提交之后会把所有的修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用

    当对缓冲区的数据进行增删改之后,首先会把增删改的数据记录在redo log buffer中,redo log buffer就会去记录数据页的物理变化。当事务提交的时候就会把redo log buffer中数据页变化刷新到磁盘中。当进行脏页刷新时出错了,就能通过redo log进行恢复。

undo log

    回滚日志,用于记录数据被修改前的信息,作用包含:提供回滚、MVCC(多版本并发控制)。

    redo log是记录物理日志,而undo log是逻辑日志。当执行delete或update时,它都会记录一条相反的记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容

    Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立刻删除undo log,这些日志还可能用于MVCC。

    Undo log存储:undo log采用段的方式进行管理和记录,存放在rollback segment回滚段中。

MVCC实现原理

概念

  • 当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。
  • 快照读:简单的select(不加锁)就是快照读,读取的是可见版本,有可能是历史数据,不加锁,是非阻塞读。RC:每次select都会生成一个快照读;RR:开启事务后的第一个select语句就是快照读的地方;S:快照读变成当前读
  • MVCC:Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读的功能。具体实现还依赖数据库中的三个隐藏字段、undo log、readView。

隐藏字段

  • DB_TRX_ID:最近修改事务id,记录插入这条记录或最后一次修改该记录的事务id。
  • DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。
  • DB_ROW_ID:隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段

undo log版本链

    用 Undo Log 将一条记录的多个历史版本串联起来,形成一个基于ROLL_PTR(回滚指针)的链表结构。

    这个链表使得数据库能够“回到过去”,找到记录在某个特定时间点的状态。

readview

    Readview是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃(未提交)事务的id。包含四个核心字段:

  • m_ids:当前活跃事务的id集合
  • min_trx_id:最小活跃事务id
  • max_trx_id:预分配事务id,当前最大事务id+1
  • creator_trx_id:Readview创建者的事务id

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96077.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光伏项目无人机踏勘--如何使用无人机自动航线规划APP

手机号免费注册iSolarBP,一起来学习吧,注册获取无人机航线规划APP https://isolar-bp.sungrowplant.com/isolarbp#/login?qrcodeId1952928161454551042https://isolar-bp.sungrowplant.com/isolarbp#/login?qrcodeId1952928161454551042 登录--下载航…

优先搜索(DFS)实战

目录 一、DFS通用解题思路 二、逐题拆解 三、四题对比 四、总结:DFS解决矩阵问题的“万能模板” 在算法解题中,矩阵连通性问题是高频考点,而深度优先搜索(DFS)是解决这类问题的核心工具之一。它通过“一条路走到…

门控MLP(Qwen3MLP)与稀疏混合专家(Qwen3MoeSparseMoeBlock)模块解析

Qwen3MLP Qwen3MLP是基于门控机制的MLP模块,采用了类似门控线性单元(GLU)的结构。它通过三个线性变换层(gate_proj、up_proj和down_proj)和SiLU激活函数,先将输入从隐藏维度扩展到中间维度,经过…

产线相机问题分析思路

现象:复现问题 原因:问题分析、溯源,定位根本原因; 方案:提出解决方案、规避措施 验证:导入、验证方案是否可行(先小批量、再大批量);一. 现象产线反馈4pcs预览又脏污、划…

【开关电源篇】EMI输入电路-超简单解读

1. 输入电路主要包含哪些元件?滤波设计需遵循什么原则? 输入电路是电子设备(如开关电源)的“入口”,核心作用是抑制电磁干扰(EMI)、保护后级电路,其设计直接影响设备的稳定性和电磁…

胜券POS:打造智能移动终端,让零售智慧运营触手可及

零售企业运营中依然存在重重挑战:收银台前的长队消磨着顾客的耐心,仓库里的库存盘点不断侵蚀着员工的精力,导购培训的成本长期居高不下却收效甚微……面对这些痛点,零售企业或许都在等待一个破局的答案。百胜软件胜券POS&#xff…

(回溯/组合)Leetcode77组合+39组合总和+216组合总和III

为什么不能暴力,因为不知道要循环多少次,如果长度为n,难道要循环n次么,回溯的本质还是暴力,但是是可以知道多少层的暴力 之所以要pop是因为回溯相当于一个树形结构,要pop进行第二个分支 剪枝:…

07 下载配置很完善的yum软件源

文章目录前言ping 测试网络排查原因排查虚拟机的虚拟网络是否开启检查net8虚拟网络和Centos 7的ip地址是否在一个局域网点击虚拟网络编辑器点击更改设置记录net8的虚拟网络地址ip a记录Centos 7的ip地址比较net8和Centos 7的ip地址是否在一个网段解决问题问题解决办法修改net8的…

SpringBoot中添加健康检查服务

问题 今天需要给一个Spring工程添加健康检查。 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>application.yml management:endpoints:web:e…

AI工具深度测评与选型指南 - AI工具测评框架及方法论

目录引言&#xff1a;AI工具爆发期的机遇与挑战一、从AI模型到AI工具&#xff1a;核心认知与生态解析1.1 DeepSeek&#xff1a;快速出圈的国产大模型代表1.2 大模型的核心能力与类型划分1.2.1 大模型的三层能力与“双系统”类比1.2.2 生成模型与推理模型的核心差异1.3 AI工具与…

Spring Cloud Alibaba快速入门02-Nacos(中)

文章目录实现注册中心-服务发现模拟掉线远程调用1.订单和商品模块的接口商品服务订单服务2.抽取实体类3.订单服务拿到需要调用服务的ip和端口负载均衡步骤1步骤2步骤3步骤4面试题&#xff1a;注册中心宕机&#xff0c;远程调用还能成功吗&#xff1f;1、调用过;远程调用不在依赖…

【Python】数据可视化之热力图

热力图&#xff08;Heatmap&#xff09;是一种通过颜色深浅来展示数据分布、密度和强度等信息的可视化图表。它通过对色块着色来反映数据特征&#xff0c;使用户能够直观地理解数据模式&#xff0c;发现规律&#xff0c;并作出决策。 目录 基本原理 sns.heatmap 代码实现 基…

如何 正确使用 nrm 工具 管理镜像源

目录 nrm 是啥&#xff1f; nrm 的安装 查看你当前已有的镜像源 怎么切换到目标镜像源 添加镜像源 删除镜像源 测试镜像源速度 nrm 是啥&#xff1f; 镜像源&#xff1a;可以理解为&#xff0c;你访问或下载某jar包或依赖的仓库。 nrm&#xff08;Node Registry Manag…

关于对逾期提醒的定时任务~改进完善

Spring Boot 中实现到期提醒任务的定时Job详解在金融或借贷系统中&#xff0c;到期提醒是常见的功能需求。通过定时任务&#xff0c;可以定期扫描即将到期的借款记录&#xff0c;并生成或更新提醒信息。本文基于提供的三个JobHandler类&#xff08;FarExpireRemindJob、MidExpi…

springboot配置请求日志

springboot配置请求日志 一般情况下&#xff0c;接口请求都需要日志记录&#xff0c;Java springboot中的日志记录相对复杂一点 经过实践&#xff0c;以下方案可行&#xff0c;记录一下完整过程 一、创建日志数据模型 创建实体类&#xff0c;也就是日志文件中要记录的数据格式 …

Redis(50) Redis哨兵如何与客户端进行交互?

Redis 哨兵&#xff08;Sentinel&#xff09;不仅负责监控和管理 Redis 主从复制集群的高可用性&#xff0c;还需要与客户端进行有效的交互来实现故障转移后的透明连接切换。下面详细探讨 Redis 哨兵如何与客户端进行交互&#xff0c;并结合代码示例加以说明。 哨兵与客户端的交…

【.Net技术栈梳理】04-核心框架与运行时(线程处理)

文章目录1. 线程管理1.1 线程的核心概念&#xff1a;System.Threading.Thread1.2 现代线程管理&#xff1a;System.Threading.Tasks.Task 和 Task Parallel Library (TPL)1.3 状态管理和异常处理1.4 协调任务&#xff1a;async/await 模式2. 线程间通信2.1 共享内存与竞态条件2…

(JVM)四种垃圾回收算法

在 JVM 中&#xff0c;垃圾回收&#xff08;GC&#xff09;是核心机制之一。为了提升性能与内存利用率&#xff0c;JVM 采用了多种垃圾回收算法。本文总结了 四种常见的 GC 算法&#xff0c;并结合其优缺点与应用场景进行说明。1. 标记-清除&#xff08;Mark-Sweep&#xff09;…

论文阅读:VGGT Visual Geometry Grounded Transformer

论文阅读&#xff1a;VGGT: Visual Geometry Grounded Transformer 今天介绍一篇 CVPR 2025 的 best paper&#xff0c;这篇文章是牛津大学的 VGG 团队的工作&#xff0c;主要围绕着 3D 视觉中的各种任务&#xff0c;这篇文章提出了一种多任务统一的架构&#xff0c;实现一次输…

python编程:一文掌握pypiserver的详细使用

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 一、 pypiserver 概述 1.1 pypiserver是什么? 1.2 核心特性 1.3 典型应用场景 1.4 pypiserver优缺点 二、 安装与基本使用 2.1 安装 pypiserver 2.2 快速启动(最简模式) 2.3 使用私有服务器安装包 2.4 向私有服务…