什么是事务?并发事务引发的问题?什么是MVCC?
文章目录
- 什么是事务?并发事务引发的问题?什么是MVCC?
- 1.事务的四大特性
- 2.并发事务下产生的问题:脏读、不可重复读、幻读
- 3.如何应对并发事务引发的问题?
- 4.什么是MVCC?
- 5.可见性规则?
- 参考资料
什么是事务?并发事务引发的问题?什么是MVCC?
1.事务的四大特性
- 原子性是指事务中的所有操作要么全部执行成功,要么全部执行失败。
- 一致性是指在事务执行前后,数据库的状态必须一致。
- 隔离性是指数据库允许多个并发事务对同一个数据进行读写和修改的能力。
- 持久性是指事务完成后对数据的修改是永久的。
2.并发事务下产生的问题:脏读、不可重复读、幻读
脏读就是指在事务A中已经修改过的数据被事务B读取了,但是这个事务A回滚了,那么事务B就是脏读了。
不可重复读是指事务A多次读取同一个数据,但是其中有一次被事务B修改了,那么就会造成前后不一致,这就是不可重复读。
幻读是指事务A多次查询数据数量,但是在其中某一次可能因为事务B的增删操作,发现不一致时,就是幻读。
按我理解就是说,不可重复读注重的是这个数据是否更新了,而幻读注重的时候是否进行了增删操作导致数据量变了。
3.如何应对并发事务引发的问题?
数据库为我们提供了四大隔离级别:读未提交、读提交、可重复读、串行化。
- 读未提交:事务可以读取其他事务未提交的数据,如果未提交的事务回滚,那么这些数据就是无效的。
- 读提交:事务只能读取其他事务提交的数据。但是在事务A中多次读取同一数据,若其他事务已经提交了对这个数据的修改,就会造成不可重复读问题。
- 可重复读隔离级别:在一个事物执行过程中看到的数据都是这个事务启动时的数据快照,就算是修改了这个数据并提交的事务也不会影响这个数据快照。但是若进行insert和delete操作就会发生幻读现象。
- 串行化:通过加锁机制,确保事务串行执行,避免所有并发问题。
那么这些隔离级别是怎么实现的呢?
对于读未提交隔离级别,什么问题也没有解决,所以直接读取最新的数据即可。
对于读提交和可重复读隔离级别,都是通过MVCC实现的,只是创建的read view时机不同。
对于串行化,通过加读写锁的方式避免并行访问。
4.什么是MVCC?
MVCC是MySQL在创建事务时,读提交和可重复读隔离级别使用的核心控制机制。
MVCC是通过undo日志版本链和read view实现的,每一个事务在创建的时候都会生成一个read view。

m_ids:当前活跃事务的 ID 列表。
min_trx_id:m_ids 中的最小事务 ID。
max_trx_id:下一个即将分配的事务 ID。
creator_trx_id:创建该 Read View 的事务 ID。

read view有四个字段+行数据中隐藏的两个字段实现了MVCC。行数据中的两个隐藏列实现了undo log版本链,trx_id记录正字啊操作这个行数据的事务,roll_pointer记录上一个历史版本的数据用来回滚操作。
MVCC就是通过trx_id、回滚指针和read view共同实现事务的可见性规则的。
在读提交和可重复读隔离级别下,需要通过MVCC来实现。
读提交是在事务执行过程中,每进行select操作时都会创建一个read view,所以每次select都能看到其他事务最近提交的数据。可重复读是在事务开始执行时创建一个read view并且在之后执行过程中都复用这个read view,那么在查询数据的时候都是事务开始之前的数据。
那么MVCC就是在这两个隔离级别下所使用的核心机制,避免了锁的使用(写操作还是需要加锁的),因为锁的效率更低。
MVCC的实现流程:每个事务都会创建一个read view,并且有唯一一个creator_trx_id,如果这个事务中操作了某些行数据,那么就会将这个creator_trx_id记录到行数据的trx_id中,并且会让行数据的回滚指针指向历史版本,然后这个read view就会统计当前系统中活跃的事务id到m_ids列表中,min_trx_id记录最小的值,max_trx_id记录要创建的事务的下一个id,如果某个事务需要回滚那么就会通过这个creator_trx_id去查找对应的最新的trx_id的行数据,然后遍历回滚指针恢复到最初的数据。
如何去判断这个read view是怎么进行可见性规则的?m_ids就是活跃事务列表,仅存放所有还在活跃的事务。 这个m_ids分为三部分,已经提交的事务,正在活跃的事务区间,但是这个区间内部也有已经提交的事务因为并发,以及待未创建的事务id,如果在第一部分是可以读取的,在第二部分要去进行判断(错误描述)。
那我是不是可以理解为 这个m_ids列表存放的事务id,其实系统中的所有read view的m_ids都是一样的呢?
不是的,m_ids中存放的创建当前read view是系统中活跃的事务id(自身不计入)。
综上,MVCC就是多版本并发控制,通过记录历史版本数据,解决了读写冲突问题,避免了查询数据时加读锁,提高了事务的并发性能。事务在启动时,会创建read view记录当前未提交的事务,通过与历史版本数据的事务id根据可见性规则判断,当前记录是否可见,否则就继续跟进undo log版本链去查早最近的可见数据。
5.可见性规则?
可见性规则是由read view实现的,read view中有四个字段:creator_trx_id、min_trx_id、max_trx_id、m_ids。
如果记录的事务id小于min_trx_id,那么就是可见的。
如果记录的事务id大于等于max_trx_id,就是不可见的。
如果记录的事务id在min_trx_id和max_trx_id之间,还需要判断这个id是否存在于m_ids中,若存在就是未提交,是不可见的,否则就是可见的。
参考资料
1、https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B
相关文章:
什么是事务?并发事务引发的问题?什么是MVCC?
文章目录 什么是事务?并发事务引发的问题?什么是MVCC?1.事务的四大特性2.并发事务下产生的问题:脏读、不可重复读、幻读3.如何应对并发事务引发的问题?4.什么是MVCC?5.可见性规则?参考资料 什么…...
【JavaEE进阶】MyBatis通过注解实现增删改查
目录 🍃前言 🍀打印日志 🌴传递参数 🎋增(Insert) 🚩返回主键 🎄删(Delete) 🌲改(Update) 🌳查(Select) 🚩起别名 🚩结果映射 🚩开启驼…...
Uptime Kuma实现业务接口自定义逻辑监控
背景 在现代分布式架构中,业务系统通常由多个微服务组成,微服务之间通过接口进行数据交互。为了确保业务的正常运行,我们需要对这些接口进行监控,及时发现并处理异常情况。然而,由于业务数据接口的复杂性,通用的监控方式往往难以满足需求,需要自定义逻辑来判断接口数据是否异常…...
基于 JavaWeb 的 Spring Boot 调查问卷管理系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
新手小白学习棒球规则·棒球1号位
新手小白学习棒球规则,可以从以下几个方面入手: 一、球场与球员 • 球场布局:棒球场呈菱形,由四个垒位(一垒、二垒、三垒和本垒)和一个投手板组成,外围是外场区域。内场为正方形,四…...
单元测试的策略有哪些,主要包括什么?
单元测试的策略及主要内容 单元测试(Unit Testing)是指对软件系统中的最小可测试单元(通常是一个函数、方法或类)进行验证,以确保其行为符合预期。常见的单元测试策略可以分为基于代码的策略和基于数据的策略…...
深度学习之图像回归(一)
前言 图像回归任务主要是理解一个最简单的深度学习相关项目的结构,整体的思路,数据集的处理,模型的训练过程和优化处理。 因为深度学习的项目思路是差不多的,主要的区别是对于数据集的处理阶段,之后模型训练有一些小…...
Docker 替换到 Containerd (nerdctl相关指令)
因为docker不给用了,所以使用Containerd来代替 前置准备 安装 Containerd # 安装 containerd yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y containerd.io # 生成默认配置文件 mkdir -p…...
Ollama API 参考文档
文档来源:API 参考文档 -- Ollama 中文文档|Ollama官方文档 端点 生成完成生成聊天完成创建模型列出本地模型显示模型信息复制模型删除模型拉取模型推送模型生成嵌入列出正在运行的模型版本...
PHP房屋出租出售高效预约系统小程序源码
🏠 房屋出租出售高效预约系统 —— 您的智能找房新选择 💡 这是一款集智慧与匠心于一体的房屋出租出售预约系统,它巧妙地融合了ThinkPHP与Uniapp两大先进框架,精心打造而成。无论是小程序、H5网页,还是APP端ÿ…...
学习threejs,使用MeshBasicMaterial基本网格材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshBasicMaterial 二…...
Kafka Connect 功能介绍
Kafka Connect 是一款用于在 Apache Kafka 和其他系统之间进行数据传输的工具,它提供了以下功能: 1. 通用框架 标准化集成:Kafka Connect 提供了一个通用框架,用于将其他数据系统与 Kafka 集成,简化了连接器的开发、部署和管理。支持多种数据系统:可以快速定义连接器,将…...
从卡顿到丝滑:火山引擎DeepSeek-R1引领AI工具新体验
方舟大模型体验中心全新上线,免登录体验满血联网版Deep Seek R1 模型及豆包最新版模型:https://www.volcengine.com/experience/ark?utm_term202502dsinvite&acDSASUQY5&rcGO9H7M38 告别DeepSeek卡顿,探索火山引擎DeepSeek-R1的丝滑之旅 在A…...
Vulnhub-node靶机教学
本篇文章旨在为网络安全渗透测试靶机教学。通过阅读本文,读者将能够对渗透Vulnhub系列node靶机有一定的了解 一、信息收集阶段 靶机下载地址:https://www.vulnhub.com/entry/node-1,252 因为靶机为本地部署虚拟机网段,查看dhcp地址池设置。得…...
php处理图片出现内存溢出(Allowed memory size of 134217728 bytes exhausted)
错误: 最近做图片上传功能时发现上传某些图片时报内存溢出错误。如下所示: {"code": 0,"msg": "Allowed memory size of 134217728 bytes exhausted (tried to allocate 24576 bytes)","data": {"code&q…...
网络IP跳动问题解决详
一、问题原因分析 DHCP服务器配置问题: DHCP服务器租期设置过短。 DHCP地址池范围过小,导致地址耗尽。 网络中可能存在多个DHCP服务器,导致IP分配冲突。 网络中存在IP地址冲突: 手动配置的IP地址与DHCP分配的地址冲突。 网络中存在未经授权的DHCP服…...
Linux firewalld 常用命令
本文参考RedHat官网文章How to configure a firewall on Linux with firewalld。 Firewalld 是守护进程名,对应命令为firewall-cmd。帮助详见以下命令: $ firewall-cmd --helpUsage: firewall-cmd [OPTIONS...]General Options-h, --help Pr…...
LeetCode 热题 100 49. 字母异位词分组
LeetCode 热题 100 | 49. 字母异位词分组 大家好,今天我们来解决一道经典的算法题——字母异位词分组。这道题在LeetCode上被标记为中等难度,要求我们将字母异位词组合在一起。下面我将详细讲解解题思路,并附上Python代码实现。 问题描述 给…...
从 DeepSeek 到飞算 JavaAI:AI 开发工具如何重塑技术生态?
在科技飞速发展的当下,AI 开发工具正以前所未有的态势重塑技术生态。从备受瞩目的 DeepSeek 到崭露头角的飞算 JavaAI,它们在不同维度上推动着软件开发领域的变革,深刻影响着开发者的工作方式与行业发展走向。 DeepSeek:AI 开发领…...
OceanBase 初探学习历程之二——操作系统参数最佳实践
本文章分享OB操作系统参数最佳实践值,相关参数部分来自PK项目得知,仅供参考,实际参数设置仍需结合现有设备条件及业务系统特点是否有必要如此设置,但我任务大部分场景均可用(仅本人个人观点)。 1、磁盘配置…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
