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的东西可以看我的另一篇文章。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 界面上字体自适应控件大小 - 随控件缩放

Qt 界面上字体自适应控件大小 - 随控件缩放 引言一、设计思路二、进阶版大致思路三、参考链接 引言 Qt控件自适应字体大小可以用adjustSize()函数,但字体自适应控件大小并没有现成的函数可调. - 本文实现了按钮上的字体随按钮大小变化而变化 (如上图所示) - 其他控件…

webgl入门-绘制三角形

绘制三角形 前言 三角形是一个最简单、最稳定的面,webgl 中的三维模型都是由三角面组成的。咱们这一篇就说一下三角形的绘制方法。 课堂目标 理解多点绘图原理。可以绘制三角形,并将其组合成多边形。 知识点 缓冲区对象点、线、面图形 第一章 web…

Denoising Diffusion Probabilistic Models 全过程概述 + 论文总结

标题:Denoising(🌟去噪)Diffusion Probabilistic Models(扩散概率模型) 论文(NeurIPS会议 CCF A 类):Denoising Diffusion Probabilistic Models 源码:hojona…

通过unsplash引入图片素材

如果您还没听说过——当您需要无版权费的照片用于项目时,无论是否用于商业目的,Unsplash 都是您的不二之选。我自己也经常用它来获取大型背景图像。 虽然他们为开发者提供了出色的 API,但他们还为您提供了通过 URL 直接访问随机图片的选项。…

《python编程从入门到实践》day39加更

# 昨日知识点回顾 添加主题、条目 # 今日知识点学习 19.1.3 编辑条目 1.URL模式edit——entry # learning_logs/urls.py ---snip---# 用于编辑条目的页面path(edit_entry/<int:entry_id>/, views.edit_entry, nameedit_entry), ] 2.视图函数edit_entry() # views.py fr…

《计算机网络微课堂》1-2:因特网概述

1-2&#xff1a;因特网概述 网络、互连网&#xff08;互联网&#xff09;和因特网因特网发展的三个阶段因特网的标准化工作因特网的组成 ‍ 网络、互连网&#xff08;互联网&#xff09;和因特网 我们首先介绍网络、互联网&#xff08;互连网&#xff09;因特网的基本概念&a…

linuxwindows硬件信息midecod和wmic命令

1、命令dmidecode -t实例 1.1命令格式 dmidecode -t [类型代码或名称 ] 指令 1.2获取系统信息 [rootlala docker]# dmidecode -t 1 1.3获取主板信息&#xff1a; [rootshanghai docker]# dmidecode -t 2 1.4获取CPU ID dmidecode -t 4 | grep ID 1.5获取系统序列号 …

C++STL---string知识汇总

前言 我们现在开始CSTL的学习&#xff0c;从这时开始我们就要锻炼自己查看英文文档的能力&#xff0c;每种数据结构都有上百个接口函数&#xff0c;我们把他们全部记下来是不可能的&#xff0c;所以我们只记最常见的20几个接口&#xff0c;其他的大概熟悉有什么功能&#xff0…

奇舞周刊第529期:万字长文入门前端全球化

周五快乐&#xff08;图片由midjourney生成&#xff09; 奇舞推荐 ■ ■ ■ 万字长文入门前端全球化 目前国内企业正积极开拓国际市场&#xff0c;国际化已成为重要的发展方向&#xff0c;因此产品设计和开发更需考虑国际化。本文介绍了语言标识、文字阅读顺序等诸多知识。然后…

卡特兰数-

是组合数学中一种常出现于各种计数问题中的数列。 一、简单介绍 卡特兰数是一个数列&#xff0c;其前几项为&#xff08;从第零项开始&#xff09; : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 47763…

LeetCode:279.完全平方数

class Solution:def numSquares(self, n: int) -> int:dp[i for i in range(n1)]for i in range(2,n1):for j in range(1,int(i**(0.5))1):dp[i]min(dp[i],dp[i-j*j]1)return dp[-1]代码解释 初始化 DP 数组&#xff1a; dp [i for i in range(n1)] 这里&#xff0c;dp[i]…

OpenAI策略:指令层级系统让大模型免于恶意攻击

现代的大模型&#xff08;LLMs&#xff09;不再仅仅是简单的自动完成系统&#xff0c;它们有潜力赋能各种代理应用&#xff0c;如网页代理、电子邮件秘书、虚拟助手等。然而&#xff0c;这些应用广泛部署的一个主要风险是敌手可能诱使模型执行不安全或灾难性的行动&#xff0c;…

探索集合python(Set)的神秘面纱:它与字典有何不同?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、集合&#xff08;Set&#xff09;与字典&#xff08;Dictionary&#xff09;的初识 1. …

元组的创建和删除

目录 使用赋值运算符直接创建元组 创建空元组 创建数值元组 删除元组 自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 元组&#xff08;tuple&#xff09;是Python中另一个重要的序列结构&#…

太空几乎没有阻力,飞船理论上能一直加速,为何还说星际旅行很难

太空几乎没有阻力&#xff0c;飞船理论上能一直加速&#xff0c;为何还说星际旅行很难&#xff1f; 答案 现代科学认为&#xff0c;我们的地球诞生于46亿年前&#xff0c;也就是太阳系诞生初期&#xff0c;在太阳系中一共有八大行星&#xff0c;而地球是唯一一颗诞生了生命的…

性能测试学习之基本概念和认识(一)

一、概念 1.性能测试&#xff1a;使用自动化工具&#xff0c;模拟不同场景&#xff0c;对软件各项性能指标进行测试和评估的过程 2.包括&#xff1a;a.后台处理程序的性能&#xff1b;b.应用服务器、数据库、架构设计是否存在瓶颈&#xff1b;c.服务器资源消耗(CPU、内存、磁…

游戏行业 2024 Q1报告 | 国内同比上升7.6%,海外收入同比环比双增长,码住!

作为中国音像与数字出版协会主管的中国游戏产业研究院的战略合作伙伴&#xff0c;伽马数据发布了《2024年1—3月中国游戏产业季度报告》。 数据显示&#xff0c; 2024年1—3月&#xff0c;中国游戏市场实际销售收入726.38亿元&#xff0c;同比增长7.60%&#xff0c;主要受移动游…

Linux防火墙之iptables(二)

一.SNAT策略概述 1.SNAT 策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet&#xff08;私有IP不能在Internet中正常路由&#xff09; 局域共享上网 2.SNAT 策略的原理 源地址转换&#xff0c;Source Network Address Translation 修改数据包的源地址 未作SNAT转换…

一.架构设计

架构采用 ddd 架构&#xff0c;不同于传统简单的三层的架构&#xff0c;其分层的思想对于大家日后都是很有好处的&#xff0c;会给大家的思想层级&#xff0c;提高很多。 传统的项目 现有的架构 采取ddd架构&#xff0c;给大家在复杂基础上简化保留精髓&#xff0c;一步步进行…

TOTP 算法实现:双因素认证的基石(C/C++代码实现)

双因素认证&#xff08;Two-Factor Authentication, 2FA&#xff09;扮演着至关重要的角色。它像是一道额外的防线&#xff0c;确保即便密码被窃取&#xff0c;不法分子也难以轻易突破。在众多双因素认证技术中&#xff0c;基于时间的一次性密码&#xff08;Time-Based One-Tim…