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

什么是事务?并发事务引发的问题?什么是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_idm_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)是指对软件系统中的最小可测试单元(通常是一个函数、方法或类)进行验证,以确保其行为符合预期。常见的单元测试策略可以分为基于代码的策略和基于数据的策略&#xf…...

深度学习之图像回归(一)

前言 图像回归任务主要是理解一个最简单的深度学习相关项目的结构,整体的思路,数据集的处理,模型的训练过程和优化处理。 因为深度学习的项目思路是差不多的,主要的区别是对于数据集的处理阶段,之后模型训练有一些小…...

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端&#xff…...

学习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、磁盘配置…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

什么是VR全景技术

VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...