MySQL中的事务

article/2025/7/12 15:26:58

事物特性

  • 原子性:事物时最小的执行单位,不允许分割。事物的原子性确保动作要么全部完成,要么完全不起作用,如果在执行过程中发生错误,会被回滚到事物开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:是指事物操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有有关完整的数据空间,对其他并发事务时隔离的。也就是说,消费者买商品这个事务,不影响其他消费者购买。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

InnoDB引擎通过什么技术来保证事务的这四个特性呢?

  • 持久性是通过redo log(重做日志)来保证的;
  • 原子性是通过undo log(回滚日志)来保证的;
  • 隔离性是通过MVCC(多版本并发控制)或锁机制来保证的;
  • 一致性则是通过持久性+原子性+隔离性来保证;

并行事务会引发什么问题?

MySQL服务端是允许多个客户端连接的,这意味着MySQL会出现同时处理多个事务的情况。

那么就可能会出现脏读、不可重复读、幻读的问题。

脏读

        表示一个事务能够读取另一个事务中还未提交的数据。比如:某个事务尝试插入记录A,此时该事务还未提交,然后另一个事务尝试读取到了记录A。

        事务 A 读取了事务 B 未提交的数据。若事务 B 回滚,事务 A 读到的数据就是无效的,A读到的就是过期的数据,这种现象被称为脏读。

不可重复读

        在一个事务内多次读取同一个发数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了不可重复读的现象。

不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现值不一样了。

脏读和不可重复读不一样的

简单来说,脏读是读到未提交数据,不可重复读是因其他事务提交修改导致同一事务内多次读结果不同。

幻读

在一个事务内多次查询某个符合查询条件的记录数量,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了幻读现象。

幻读的重点在于新增或者删除: 同样的条件,第1次和第2次读出俩的记录数不一样

在一个事务中,按照相同的查询条件多次查询,由于其他事务对数据进行了插入或删除并提交,导致查询结果的行数发生了变化。

事务的隔离级别有哪些?

  • 脏读:读到其他事务未提交的数据;
  • 不可重复:读前后的数据不一致;
  • 幻读:前后读取的记录数量不一致;

严重性排序如下:

脏读>不可重复读>幻读

SQL标准提出了四种隔离级别来规避这些想想,隔离级别越高,性能效率越低,这四个隔离级别别如下:

  • 读未提交:指一个事务还没提交时,它做的变更就更能被其他事务看到;
  • 读提交:指一个事务提交之后,它做的变更才能被其他事务看到;
  • 可重复读:指一个事务执行过程中看到的数据,一直跟这个事物启动时看到的数据是一致性的,MySQL InnoDB引擎的默认隔离级别;
  • 串行化:会对记录加上读写锁,在多个事物对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事物执行完成,才能继续执行;

按隔离级别高低排序如下:

串行化>可重复读>读已提交>读未提交

针对不同的隔离级别,并发事务时可能发生的现象也会不同。

也就是说:

  • 读未提交隔离级别下,可能发生脏读、不可重复和幻读现象;

  • 读提交隔离级别下,可能发生不可重复读和幻读现象。

  • 可重复读隔离级别下,可能发生幻读现象。

  • 串行化隔离级别下,都不会发生。

        所以,要解决脏读,就要升级到读提交以上的隔离级别;要解决不可重复读现象,就要升级到可重复读级别等。解决幻读不建议将隔离级别升级到串行化。

        MySQL虽然支持4种隔离级别,但是与SQL标准种规定的隔离级别允许发生的现象却有些出入。

        MySQL InnoDB引擎的默认隔离级别虽然是重复读,但是它很大程度上避免幻读现象(并不是完全解决)解决方案有两种:

  • 针对快照读(普通select语句):是通过MVCC方式解决幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致性的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好的避免幻读问题。

  • 针对当前读(select...for update等语句):通过next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行select..for update语句的时候,会加上next-key lock,如果有其他事务在next-key lock锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以很好的避免幻读问题。

四种隔离级别如何实现

实现方式:

  • 对于读未提交隔离级别来说,因为可以读到未提交事务修改的数据,所以直接读取最新的数据就好了;

  • 对于串行化隔离级别的事务来说,通过加读写锁的方式来避免并行访问;

  • 对于读提交和可重复读的隔离级别的事务来说,它们是通过Read View来实现的,它们的区别在于创建Read View的时机不同,可以把Read View理解成一个数据快照,定格在那一刻的状态。读提交隔离级别是每个语句执行前都会重新生成一个Read View,而可重复读隔离级别是启动事务时生成一个Read View,然后整个事务期间都在用这个Read View。


http://www.hkcw.cn/article/vVlTCyNoap.shtml

相关文章

像素转换案例实战

本案例介绍像素单位的基本知识与像素单位转换API的使用。通过像素转换案例,向开发者讲解了如何使用像素单位设置组件的尺寸、字体的大小以及不同像素单位之间的转换方法。主要功能包括: 展示了不同像素单位的使用。展示了像素单位转换相关API的使用。 …

结构型设计模式之桥接模式

文章目录 1. 桥接模式概述2. 模式结构3. 桥接模式的优缺点优点缺点 4. 桥接模式的应用场景5. C#代码示例5.1 简单示例 - 形状与颜色5.2 更复杂的示例 - 跨平台消息发送系统 6. 桥接模式与其他模式的比较7. 真实世界中的桥接模式应用7.1 数据库驱动7.2 UI框架中的渲染机制 8. 桥…

RAG系统中如何检测幻觉?

虽然我们的 RAG 系统通过将答案基于真实的医学证据来减少幻觉,但我们发现了一个关键的差距:即使有引用,系统仍然可能产生不可靠的输出。 想想看:仅仅因为一个系统可以引用来源,并不意味着它正确地使用了这些来源。 模型可能会: 从检索到的文档中提取不相关的信息不适当…

world quant教程学习

Understanding Corporate Fundamental Data 🔍 了解企业基本面数据 Lets explore fundamental data😊 Fundamentals capture the underlying business, financial and operational health of a company, usually reported every quarter. This data is t…

详解鸿蒙仓颉开发语言中的计时器

今天又到了大家喜闻乐见的科普环节,也可以说是踩坑环节,哈哈哈。今天聊一聊仓颉开发语言中的计时器,这部分可老有意思了。 为什么这么说呢,因为关于仓颉的计时器你几乎搜不到任何的文档,也没有相关的代码提示&#xf…

70多套创业商业融资计划书PPT模板分享

70多套创业商业融资计划书PPT模板分享,商业计划书、融资计划书为主的欧美风格PPT模板。 70多套创业商业融资计划书PPT模板分享:创业商业融资计划书PPT模板https://pan.quark.cn/s/e09456cd487b

基于 StarRocks + Iceberg,TRM Labs 构建 PB 级数据分析平台实践

作者: Vijay Shekhawat:TRM Labs 数据平台团队核心成员,精通实时流处理、数据湖仓架构及构建安全、高吞吐的数据分析管道,在推动 PB 级数据处理能力方面发挥了关键作用。 Andrew Fisher:TRM Labs 资深软件工程师&…

Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)

一、线程安全推理 在多线程环境中运行YOLO 模型需要仔细考虑,以确保线程安全。Pythons threading 模块允许您同时运行多个线程,但在这些线程中使用YOLO 模型时,需要注意一些重要的安全问题。本页将指导您创建线程安全的YOLO 模型推理。 1.1、…

机器学习知识图谱——朴素贝叶斯算法

目录 一、图解朴素贝叶斯算法知识图谱 二、基本概念 三、核心思想 四、为什么叫“朴素”? 五、算法流程图 六、常见模型类型 七、优点 与 缺点 八、实战代码 (以文本分类为例) 九、应用举例 机器学习知识图谱——朴素贝叶斯算法 一、图解朴素贝叶斯算法知识图谱 该…

ollama+open-webui,本地部署自己的大模型

目录 一、效果预览 二、部署ollama 1.ollama说明 2.安装流程 2.1 windows系统 2.1.1下载安装包 2.1.2验证安装结果 2.1.3设置模型文件保存地址 2.1.4拉取大模型镜像 2.2linux系统 2.2.1下载并安装ollama 2.2.2设置环境变量 2.2.3拉取模型文件 三、部署open-webui…

大模型赋能:2D 写实数字人开启实时交互新时代

在数字化浪潮席卷全球的当下,人工智能技术不断突破创新,其中大模型驱动的 2D 写实数字人正成为实时交互领域的一颗新星,引领着行业变革,为人们带来前所未有的交互体验。 一、2D 写实数字人概述 2D 写实数字人是通过计算机图形学…

效率工具- git rebase 全解

一、前言 对于git rebase 一直不太了解,这几天想着提高下git提交质量,就发现了这个好用的指令,顺便记录一下,好加深记忆 贴出官方文档以便大家进一步学习 Git 二、rebase是作用 rebase 官方解释为变基,可以理解为移动你的分支根节点,维护一个更好的提交记录。rebase把你当前…

【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具

📋【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自…

π0的微调——如何基于各种开源数据集、以及私有数据集微调openpi(含我司七月的微调实践及在机械臂上的部署)

前言 25年2.4日,几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST,如之前所介绍的,他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址:github.com/Ph…

开源模型应用落地-qwen模型小试-Qwen3-8B-融合VLLM、MCP与Agent(七)

一、前言 随着Qwen3的开源与技术升级,其在企业中的落地场景正加速拓展至多个垂直领域。依托Agent智能体能力 和MCP协议的工具调用接口 ,Qwen3可深度融入企业业务流程,为企业提供从需求解析到自动化开发的全链路支持。 本篇将介绍如何实现Qwen3-8B模型集成MCP实现智能体交互。…

【Git】GitHub 连接失败解决方案:Failed to connect to github.com port 443 after 21090 ms: Couldn’t connect to se

文章目录 一、使用 VPN 环境下的解决方案1. 检查当前代理设置2. 配置 Git 使用代理3. 验证代理设置是否生效4. 刷新 DNS 缓存5. 重新尝试 Git 操作 二、未使用 VPN 环境下的解决方案1. 取消 Git 配置的代理2. 验证代理设置已成功移除3. 重试 Git 操作 三、总结使用 VPN 的解决方…

Java 大视界 -- Java 大数据机器学习模型在元宇宙虚拟场景智能交互中的关键技术(239)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Digital Reengineering and Localized Implementation of the Five-Dimensional Management Cycle System

A Paradigm Shift in Intelligent Hospital Governance(Preliminary draft of the first-line cooperation project) Abstract This study pioneers a transformative approach to healthcare management through the “Technology-Management-Value” (TMV) triad model, r…

Qwen3:重磅开源,重夺开源第一!(包含详细使用教程)

1.简介 Qwen3,这是 Qwen 系列大型语言模型的最新成员。我们的旗舰模型 Qwen3-235B-A22B 在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。此外&#xf…

基于 Alpine 定制单功能用途(kiosk)电脑

前言 故事回到 7 年前, 在网上冲浪的时候发现了一篇介绍使用 Ubuntu 打造 kiosk 单功能用途电脑的文章, 挺好玩的, 就翻译了一下并比葫芦画瓢先后用了 CentOS 7, ArchLinux 进行了实现. 历史文章: 翻译 - 使用Ubutnu14.04和Chrome打造单功能用途电脑(大屏展示电脑) 使用CentOS…