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

news2024/11/15 19:56:30

一、什么是事务?

        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.coloradmin.cn/o/1699170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

归并排序算法(经典、常见)

今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,归并排序 基本概念: 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&am…

【LLM多模态】多模态LLM在图表处理的应用

note 在真实场景下,我们进行测试,多模态大模型在处理显著文本时表现尚可,但在处理细粒度文本时往往效果并不太好,why? ​具体原因如下: 首先,视觉编码器的分辨率对于多模态大模型的性能影响较大&#x…

空间注意力机制

第一步是沿着通道维度进行最大池化和平均池化,比如下面3*3的特征图,有3个通道。 第二步新特征图进行拼接并经过卷积调整通道数 第三步经过Sigmoid函数后乘到输入上 代码: class SpatialAttention(layers.Layer):def __init__(self):super(S…

Android 动效整理

Android自定义SeekBar,滑动时弹出气泡指示器显示进度 安卓开发中非常炫的效果集合_android 开发 向右上角收起炫酷动态效果-CSDN博客 https://github.com/shenghuntianlang/Android-Views?tabreadme-ov-file#decentbanner 以前收藏了很多文章,但是过…

JavaWeb_Web——Maven

介绍: Maven是Apache公司发行的,一个Java项目管理和构建工具 作用: 1.方便的依赖管理 2.统一的项目结构 3.标准的项目构建流程 模型: Maven通过项目对象模型(POM)和依赖管理模型(Dependency)管理依赖(jar包),如果新添…

Elasticsearch 8.1官网文档梳理 - 十三、Search your data(数据搜索)

Search your data 这里有两个比较有用的参数需要注意一下 Search timeout:设置每个分片的搜索超时时间。从集群级别可以通过 search.default_search_timeout 来设置超时时间。如果在 search.default_search_timeout 设置的时间段内未完成搜索请求,就会…

MySQL大表删除方案

1.问题 在生产环境中,执行大表删除操作时,很容易因为占用了大量io资源导致其他事务被阻塞,最终事务不断堆积导致MySQL挂掉。 2.drop命令 drop命令,MySQL主要干了两件事: 清除buffer pool缓冲(内存&…

入门五(项目介绍及登录和发布需求)

软件缺陷判定标准 项目中缺陷的管理流程 使用Excel对于缺陷进行管理 使用工具管理缺陷 一、项目背景 传智作为一个IT教育机构,拥有自己开发且实际运营的产品; 将开发和运营的技术作为授课的内容,对于学员而言学到的都是一手的真实案例和…

【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目

项目介绍 【开源】项目基于pythonpandasflaskmysql等技术实现豆瓣电影数据获取及可视化分析展示,觉得有用的朋友可以来个一键三连,感谢!!! 项目演示 【开源】2024最新python豆瓣电影数据爬虫可视化分析项目 项目截图…

02.并发编程基础概念

在正式学习 Java 的并发编程之前,我们需要熟悉和学习几个并发编程的基础概念。 1 进程和线程 1.1 进程 我们常说的是应用程序,也就是 app,由指令和数据组成。但是当我们不运行一个具体的 app 时,这些应用程序就是放在磁盘(也包括…

基于Arduino IDE的ESP32开发环境搭建

文章目录 一. Arduino IDE安装二. Arduino IDE安装ESP开发包 一. Arduino IDE安装 Arduino官网下载IDE软件 解压下载好的安装包,以管理员身份运行Arduino IDE软件 IDE第一次启动会安装各种驱动,直接点击确定就行 二. Arduino IDE安装ESP开发包 将…

深入探索C++ Vector容器:灵活的动态数组秘籍

目录 ​编辑 引言 一、初识vector:构造与初始化 二、动态管理:添加与删除元素 三、访问与遍历:多种方式直达元素 四、容量与大小:动态调整的艺术 五、进阶技巧:高效运用vector 结语 引言 在C编程的世界里&…

【Python特征工程系列】一文教你使用PCA进行特征分析与降维(案例+源码)

这是我的第287篇原创文章。 一、引言 主成分分析(Principal Component Analysis, PCA)是一种常用的降维技术,它通过线性变换将原始特征转换为一组线性不相关的新特征,称为主成分,以便更好地表达数据的方差。 在特征重要…

Day23:Leetcode:530.二叉搜索树的最小绝对差 + 501.二叉搜索树中的众数 + 236. 二叉树的最近公共祖先

LeetCode:530.二叉搜索树的最小绝对差 问题描述 解决方案: 1.思路 中序遍历 2.代码实现 class Solution {int pre;int ans;public int getMinimumDifference(TreeNode root) {ans Integer.MAX_VALUE;pre -1;dfs(root);return ans;}public void d…

生成式AI导论2024-李宏毅

生成式AI导论2024-李宏毅 第0讲: 课程说明第1讲:生成式AI是什么第2講:今日的生成式人工智慧厲害在哪裡?從「工具」變為「工具人」 第0讲: 课程说明 生成式AI的入门课程 第1讲:生成式AI是什么 生成式人…

VMware创建虚拟机

1.自定义 2.选择硬件兼容性 3.创建一个空白硬盘 4.选择操作系统和版本 5.设置虚拟机名称以及安装位置 6.处理器配置 7.设置虚拟机内存 8.设置网络类型 8.选择IO控制器 9.选择磁盘类型 10.创建一个新硬盘 11.设置磁盘容量以及磁盘个数 12.设置磁盘文件名称(默认) 13.点击完成创建…

LabVIEW直方图应用解析

概述 在LabVIEW中,直方图是一种重要的工具,用于分析和展示数据的分布情况。它通过将数据分成若干区间并绘制对应频数,可以帮助用户了解数据的集中趋势、离散程度和分布形态。本文将详细介绍LabVIEW中直方图的使用方法、适用场合、实际意义及…

工业控制2D组态界面,丑是丑了点,但非常实用。

工业控制的2D组态界面是用于监控和控制工业过程的界面。它通常具有以下特征: 实时数据显示:2D组态界面能够实时显示传感器和设备的数据,如温度、压力、流量等。这些数据以图表、仪表盘、数字显示等形式呈现,使操作人员能够实时了解…

泰拉瑞亚从零开始的开服教程

前言 本教程将讲诉使用Linux系统搭建泰拉瑞亚服务器(因为网上已经有很完善的windows开服教程了),使用的Linux发行版是Debian11,服务端使用的程序是TShock,游戏版本是1.4.4.9 所需要准备的 一台服务器(本教程使用的是…

【Torch学习笔记】

作者:zjk 和 的区别是逐元素相乘,是矩阵相乘 cat stack 的区别 cat stack 是用于沿新维度将多个张量堆叠在一起的函数。它要求所有输入张量具有相同的形状,并在指定的新维度上进行堆叠。