MySQL事务篇1:事物的四大特性(ACID)、三类数据读取问题与隔离级别

一、什么是事务?

        MySQL的事务(Transaction)是一组由数据库管理系统(DBMS)执行的一个或多个SQL语句的集合,这些SQL语句作为一个单独的工作单元执行。事务的主要目的是确保数据库的一致性和完整性,特别是在并发环境下。这些操作要么全部都执行,要么都不执行, 它是一个不可分割的工作执行单元。

二、事务的特性

        事务是由[MySQL 的引擎]来实现的,我们常见的 InnoDB 引擎它是支持事务的。不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。
        事务有四个关键特性,通常被称为ACID特性。这四个特性是:

1、原子性(Atomicity):
        事务中的所有操作要么全部成功,要么全部失败。即事务是一个不可分割的工作单元。即使在事务执行过程中发生了错误,事务中的任何更改都不会保留,系统会回滚(Undo)所有已经执行的操作,使数据库回到事务开始之前的状态。

2、一致性(Consistency)
        事务从一个一致的数据库状态转换到另一个一致的数据库状态。数据库在事务开始之前和结束之后都必须满足所有的定义的约束、触发器和规则。换句话说,事务开始前和事务结束后数据应该是一致的,例如张三有300,李四有400,那么无论他们如何转账,总钱数700应该是不变的

3、隔离性(Isolation)
        事务的执行过程对其他事务是隔离的。即使多个事务并发执行,每个事务也无法看到其他事务未提交的中间状态,即多个并发事务直接要相互隔离,互不干扰。隔离性保证了并发事务的正确执行。MySQL提供了不同的隔离级别来控制事务之间的隔离程度,包括未提交读、提已交读、可重复读和可序列化。

4、持久性(Durability)
        一旦事务提交,所做的更改将永久保存到数据库中,即使发生系统故障,数据也不会丢失。持久性通过将事务的日志记录到持久存储设备(如磁盘)上来实现。提交事务后,系统保证即使系统崩溃,也能通过日志恢复已提交的数据。

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

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

简单知道一下即可,这是一个非常复杂的底层逻辑。

三、并发事务下三类数据读取问题与数据更新

       MySQL 服务端是允许多个客户端连接的,这意味着 MySQL 会出现同时处理多个事务的情况。主要有三类数据读取问题:

1、脏读(Dirty Read):
        一个事务能够读取另一个事务尚未提交的数据。这种情况会导致读取的数据可能在未来被回滚,从而导致读取到不正确的数据。
 示例:事务A更新了某行数据,然后事务B读取了这些更新的数据。然而,事务A随后回滚了,这意味着事务B读到了未提交的、随后被撤销的数据。

2、不可重复读(Non-Repeatable Read):

        一个事务在读取某行数据后,再次读取该行数据时,发现数据已经被另一个已提交的事务修改了两次读取同一数据的结果不一致

示例:事务A在某时刻读取了一行数据。然后事务B更新了这行数据并提交。事务A再次读取该行数据时,发现数据已经改变。

3、幻读(Phantom Read):

        一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。

示例:事务A读取了满足某个条件的所有数据行。事务B插入了一些满足这个条件的新数据行并提交。事务A再次读取时,发现多了一些之前没有的数据行。

        我们对三类数据读取问题做一个总结就是:

脏读:读到其他事务未提交的数据;

不可重复读:前后读取的数据不一致;

幻读:前后读取的记录数量不一致。

        在并发事务下,不仅会遇到数据读取问题,还会遇到数据更新问题,主要有以下两类:

丢失更新(Lost Update)

        两个事务都读取同一数据并修改它们中的一个,导致一个事务的修改被另一个事务的修改覆盖,最终的更新丢失。这种情况通常发生在没有合适的锁机制来同步并发事务时。

示例:事务A和事务B都读取了同一行数据,然后事务A和事务B都修改了这行数据并提交。事务A的修改被事务B的修改覆盖,导致事务A的更新丢失。

不可重复写(Non-Repeatable Write)

        一个事务在写入某行数据后,另一个事务修改了这行数据。当第一个事务再次写入这行数据时,发现数据已经被另一个事务改变了。这种情况导致数据的不一致性。

示例:事务A和事务B同时读取同一行数据。事务A先修改了数据并提交,事务B再修改数据并提交,事务A的更改可能没有被考虑在内。

四、事务隔离级别

前面我们提到,当多个事务并发执行时可能会遇到【脏读、不可重复读、幻读】的现象,这些现象会对事务的一致性产生不同程序的影响。SQL 标准提出了四种隔离级别来规避这些现象,隔离级别越高,性能效率就越低,这四个隔离级别如下:

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

        不同的数据库厂商对 SQL 标准中规定的 4 种隔离级别的支持不一样,有的数据库只实现了其中几种隔离级别,MySQL 虽然支持 4 种隔离级别,但是与SQL 标准中规定的各级隔离级别允许发生的现象却有些出入。(隔离级别的定义由SQL提出,这不是MySQL规定的)
        MySQL InnoDB 引擎在可重复读隔离级别下,可以很大程度上避免幻读现象的发生,所以 MySQL 并不会使用串行化隔离级别来避免幻读现象的发生,因为使用串行化隔离级别会严重影响性能(毕竟是悲观锁)。而关于为什么可以很大程度上避免幻读现象的发生,这就是涉及到了一个概念叫做MVCC。

        多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种用于提高数据库系统并发性能的技术。它允许多个事务在不加锁的情况下并发读取和写入数据,从而避免了许多锁竞争问题。MVCC通过保存数据的多个版本来实现一致性和隔离性。关于更多MVCC的东西可以看我的另一篇文章。 

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

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

相关文章

民国漫画杂志《时代漫画》第16期.PDF

时代漫画16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

深入了解 Golang 多架构编译:交叉编译最佳实践

随着软件开发领域的不断发展,我们面临着越来越多的挑战,其中之一是如何在不同的平台和架构上部署我们的应用程序。Golang(Go)作为一种现代化的编程语言,具有出色的跨平台支持,通过其强大的多架构编译功能&a…

网络模型-NQA与网络协议联动

一、NQA定义 网络质量分析NQA(Network QualityAnalysis)是一种实时的网络性能探测和统计技术,可以对响应时间、网络抖动、丢包率等网络信息进行统计。NOA能够实时监视网络0oS,在网络发生故障时进行有效的故障诊断和定位。 部署IPv4静态路由与BFD…

【Text2SQL 经典模型】TypeSQL

论文:TypeSQL: Knowledge-Based Type-Aware Neural Text-to-SQL Generation ⭐⭐⭐ Code: TypeSQL | GitHub 一、论文速读 本论文是在 SQLNet 网络上做的改进,其思路也是先预先构建一个 SQL sketch,然后再填充 slots 从而生成 SQL。 论文发…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB,各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来,以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …

浅谈Docker容器的网络通信原理

文章目录 1、回顾容器概念2、容器网络3、容器与主机之间的网络连通4、交换机的虚拟实现---虚拟网桥(Bridge)5、Docker 守护进程daemon管理容器网络 1、回顾容器概念 我们知道容器允许我们在同一台宿主机(电脑)上运行多个服务&…

【UE数字孪生学习笔记】 使用DataSmith对模型快速导入 UE5.3.2使用unreal DataSmith文件

声明:部分内容来自于b站,慕课,公开课等的课件,仅供学习使用。如有问题,请联系删除。 部分内容来自UE官方文档,博客等 UE5.3.2使用 3D Max 导出的unreal DataSmith文件 1. 去UE官网下载DataSmith导出器并导…

Wpf 使用 Prism 实战开发Day25

首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 1.AddMemoViewModel 逻辑处理类,添加View视图数据要绑定的实体类 Model public class AddMemoViewModel :BindableBase,IDialogHostAware{public AddMemoV…

代码随想录-Day20

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…

[杂项]优化AMD显卡对DX9游戏(天谕)的支持

目录 关键词平台说明背景RDNA 1、2、3 架构的显卡支持游戏一、 优化方法1.1 下载 二、 举个栗子(以《天谕》为例)2.1 下载微星 afterburner 软件 查看游戏内信息(可跳过)2.2 查看D3D9 帧数2.3 关闭游戏,替换 dll 文件2…

DBAPI怎么进行数据格式转换

DBAPI如何进行数据格式的转换 假设现在有个API,根据学生id查询学生信息,访问API查看数据格式如下 {"data":[{"name":"Michale","phone_number":null,"id":77,"age":55}],"msg"…

AIGC-常见图像质量评估MSE、PSNR、SSIM、LPIPS、FID、CSFD,余弦相似度----理论+代码

持续更新和补充中…多多交流! 参考: 图像评价指标PNSR和SSIM 函数 structural_similarity 图片相似度计算方法总结 MSE和PSNR MSE: M S E 1 m n ∑ i 0 m − 1 ∑ j 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 MSE\frac{1}{mn}\sum_{i0}^{m-1}\sum_{j0}^{n-1}[…

车载电子电器架构 —— 应用软件开发(下)

车载电子电器架构 —— 应用软件开发(下) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证…

【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)

基于FastadminThinkPHP和Uniapp开发的赛事报名系统,包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言:赛事报名系统的重要性 在举办各类赛事时,一个高效便捷的报名系统对于组织者和参与者来说都至关重…

全域运营是本地生活的下半场?新的创业风口来了?

随着全域概念的兴起,全域运营赛道也逐渐进入人们的视野之中,甚至有业内人士预测,全域运营将会是本地生活下半场的大趋势。 之所以这么说,是因为全域运营作为包含了公域和私域内所有运营业务的新模式,不仅能同时做所有本…

仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码

码名称:仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码 开发环境:帝国cms7.5 空间支持:phpmysql 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码自动采集 - 我爱模板网源码名称:仿《Q极速体育》NBACBA体育直…

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…

使用LoRA进行高效微调:基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) [2106.09685] LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org) Parametrizations Tutorial — PyTorch Tutorials 2.3.0cu121 documentation 大型语言模型&#xf…

大模型应用:基于Golang实现GPT模型API调用

1.背景 当前OpenAI提供了开放接口,支持通过api的方式调用LLM进行文本推理、图片生成等能力,但目前官方只提供了Python SDK。为了后续更方便集成和应用,可以采用Golang对核心推理调用接口进行封装,提供模型调用能力。 2.相关准备…

MDK安装

MDK安装 1 MDK的差异2 切换MDK3 安装芯片支持包注意点 1 MDK的差异 不同版本MDK有略微的差别,比如:MDK536.EXE,支持版本5的交叉编译链。如下图所示: 而MDK539.EXE不支持版本5的交叉编译链,所以工作的时候&#xff0c…