什么是事务?并发事务引发的问题?什么是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、磁盘配置…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
SQLSERVER-DB操作记录
在SQL Server中,将查询结果放入一张新表可以通过几种方法实现。 方法1:使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构(包括列名和数据类型)将与查询结果匹配。 SELECT * INTO 新…...
