【从删库到跑路 | MySQL总结篇】事务详细介绍

news2025/2/25 11:07:25

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【MySQL学习专栏】🎈
本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 一、事务
  • 二、MySQL事务的基本特性
  • 三、四种事务的隔离级别

一、事务

事务概念:
事务可以看作是由一个或多个 SQL 语句组成的逻辑单元,在这个单元中,每个 SQL 语句都是相互依赖的。整个事务单元被视为一个不可分割的整体(比如我们高中物理学习到的原子,原子就是不可分割的最小单位),要么全部执行成功,要么全部回滚。

举个栗子:假设现在事务中存在3个操作,我们先执行第一个操作,在执行第二个操作,最后在执行第三个操作。好了,如果执行到第二个操作的过程中执行失败了,MySQL就会自动把之前已经执行成功的操作进行还原(此操作我们称之为回滚),还原成最初什么都没有执行的状态。

回滚是如何实现的:
把数据库中执行的每个SQL操作都记录下来(通过数据库来记录事务操作的中间过程),如果需要回滚,就需要按照之前的逆操作来进行执行就可以了(比如上个操作是插入,那么逆操作就是删除;上个操作是修改,逆操作改回去就好了)。
再比如,如果我们执行某个事务的第二步过程中,程序崩溃了,此时我们就需要对第一步就行回滚操作,即把对第一步执行的操作给修改还原回去。即使是数据库挂了或者数据库服务器重启了,我们也无需担心,因为数据库通过日志来记录事务执行过程中的中间过程,日志中的数据是始终存储在硬盘上的。如果是数据库服务器重启的话就会在服务器重启之后继续对之前没有回滚完的情况进行处理。

事务最重要的一个特性就是原子性了,原子性又是通过回滚操作来保证的,而回滚则是通过特定的日志来实现的。

一个事务中必须以这两个操作为结尾:commitrollback,如果没有这两个操作的话,那么接下来各种mysql都会被认为是工作中的一部分。如果没有这两个操作的话,那么接下来所有的SQL操作都会是认为是事务的一部分。

二、MySQL事务的基本特性

  • 原子性:事务可以看作是一个或多个SQL语句组成的逻辑单元,逻辑单元中的每个SQL语句都是相互依赖的,而整个逻辑单元就是一个不可分割的整体存在(类似于物理学到的原子,原子就是不可分割的最小单位存在)。
  • 一致性:事务执行之前和事务执行之后能够对应上,不能离谱(约束可以检查数据是否合理,回滚机制也可以支持一致性)。
  • 持久性:我们知道硬盘上的存储的数据都是持久化存储。而MySQL中的事务执行的各种操作都是持久生效的(最终都会存储到硬盘中),事务一旦执行成功,这里所有操作产生的修改都会写到硬盘中去。
  • 隔离性(重点):并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出一个权衡,隔离描述的就是同时执行的事务之间产生的相互影响。隔离性越高并发性就会越低,数据就越可靠,性能就会越低。

如何理解隔离性中的并发:
数据库是一个客户端服务器结构的程序。服务器可以在同一时刻给多个用户提供服务。且多个客户端都能给服务器提交事务。
假设提交的两个事务是修改的不同的数据库或者不同的表,那么这两个事务之间是不会产生相呼影响的;如果这两个事务是修改的同一个表,此时就可能会出现一些问题。
我们拿两个事务来进行举例,假设现在有两个客户端都把自己的事务提交给服务器,宏观上来看,这两个事务是同时提交的但在微观上来讲这两个事务总是要分一个先后顺序的。而当事务的执行顺序存在差异的时候,就有可能会影响到最终的执行结果。这就是并发执行事务所带来的一些问题。

并发执行事务时可能会出现的问题:

问题(1)脏读
脏读(Dirty Read):是指一个事务读取了另一个事务尚未提交的数据。换句话说,一个事务读取到了另一个事务“脏”的数据(可以理解为一个临时的数据),即还没有被持久化到数据库中。
假设有两个事务,事务A和事务B。事务A执行了一条更新操作但还未提交,事务B在此时读取了事务A尚未提交的数据。如果事务A回滚了,那么事务B读取到的数据就是无效的或者不准确的,因此称为脏读
如何解决脏读问题:
写操作加锁:事务A在进行写操作的时候,其它事务无法读取事务A进行写操作期间的数据(但可以读取到事务A开始写操作之前的数据),只有事务A的写操作完成提交之后,其它事务才能读取到事务A中的最新数据。

引入了写加锁之后,降低了事务之间的并发性,提高了隔离性,效率会降低但是提高了数据的可靠性。

问题(2):不可重复读
不可重复读:在同一个读取数据的事务中,可能会涉及到多个读操作,而每个读操作读取的数据都不一样。(这里每次读操作读取的数据并非是脏数据,我们可以将其理解为不同版本的数据)
如何解决不可重复读

读操作加锁:给读操作加锁的意思就是在读取一个事务数据的过程中,我们是不能让这个事务进行写操作的。

我们再来区分一下给读操作加锁和给写操作加锁:
给写操作加锁的意思:就是我们在对事务A进行写操作的时候,其它事务是无法读取到事务A中的最新数据(只能读取到事务A进行写操作之前的旧数据),只有当事务A提交写操作之后,其它事务才能读取到事务A中的最新数据。

给读操作加锁的意思:我们在读取事务A数据的时候,此时事务A是不能开启另外一个事务进行写操作的。
读操作加锁之后,事务之间的并发性就会进一步降低,隔离性增加,当然效率降低,数据变得更加可靠。

问题(3):幻读(可以理解为幻读就是不可重复读的特殊情况)
幻读指的是一个事务在多次读的时候虽然每次读到的数据的值是一样的,但是每次读的结果集是不同的。比如第一次读读到的是100条记录,第二次读读到的变成了101条记录。第一次读到的100条记录和第二次读到的100条记录是完全相同的。只不过第二次多读了1条记录。
如何解决幻读:串行化
串行化就是彻底的放弃并发执行,即所有的事务变成了一个挨一个的串行执行(即执行完一个事务后再执行另外一个事务)。
串行话是并发性最低的,隔离性最强的,效率最低,数据也是更加的可靠。

在并发性事务执行的过程中,可能会出现以下问题:

  • 脏读(写加锁解决):读到了写事务提交之前的中间数据(即临时数据)
  • 不可重复读(读加锁解决):一个事务之内多次读取到一个数据,发现每次读取的数据都是不一样的。
  • 幻读(解决方法就是串行化,完全放弃并发执行):一个事务之内多次读到的数据的值是相同的,但是每次读取的结果集不同。

三、四种事务的隔离级别

针对并发事务执行的过程中可能出现的问题,MySQL提供了四种事务的隔离级别

  • read uncommitted(RU):允许读未提交的数据。此时存在脏读、不可重复读、幻读的问题,事务之间隔离性最低,并发程度最高,效率最高且数据的可靠性最低。
  • read committed(RC):只允许读取已提交的数据(相当于给写加锁,解决了脏读的问题),但是还存在不可重复读和幻读的问题。事务间的隔离性提高,并发性降低。数据更可靠与此同时效率降低。
  • repeatable read(默认的隔离级别)(RR):可以重复读取数据(相当于给写操作和读操作都加锁)。事务间的隔离性提高,并发性降低,效率降低,且数据可靠性提高。解决了脏读和不可重复读的问题,但依然存在幻读的问题。
  • serializable:事务彻底地进行串行执行。解决了脏读、不可重复读、幻读这三个问题。此时事务间的隔离性最高,并发性最低(或者说没有并发性),数据最可靠,效率也最低。

以上就是MySQL中四种事务的隔离性级别,当然要根据实际的需求场景来决定具体使用哪一种隔离级别,尽量找到一个效率和可靠性都能够接收的情况。大部分情况下使用默认的MySQL隔离性级别就可以了(repeatable read)。

好了,以上就是本文的全部内容了。讲解了MySQL中事务的相关内容。大家一定要好好掌握这一部分的内容,因为面试中事务这一部分算是数据库中比较高频的内容,尤其是隔离性这里。

嗯,就到这里吧,再见啦友友们!!!
在这里插入图片描述

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

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

相关文章

多项式拟合求解

目录 简介 基本原理 例1 例2 例3 参考资料 简介 多项式拟合可以用最小二乘求解,不管是一元高阶函数,还是多元多项式函数,还是二者的混合,都可以通过统一的方法求解。当然除了最小二乘法,还是其他方法可以求解&…

分享一个国内可用的免费GPT4-AI提问AI绘画网站工具

一、前言 ChatGPT GPT4.0,Midjourney绘画,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而,GPT-4对普…

【尾递归】

尾递归 如果函数在返回前才进行递归调用,则该函数可以被编译器或解释器优化,使其在空间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此…

CookieSession Redis 到JWT会话管理历史

单应用时期,通常使用 Cookies 和 Session 进行会话管理。 用户登录后,服务器创建一个唯一的会话标识符(Session ID),将其存储在浏览器的 Cookies 中,并在服务端维护一个关联该标识符的会话对象。 这种方…

【C++】类和对象——初始化列表和static修饰成员

首先我们来谈一下初始化列表,它其实是对于我们前边构造函数体内初始化的一种补充,换一种说法,它以后才是我们构造函数的主体部分。 我们先考虑一个问题,就是一个类里面有用引用或const初始化的成员变量,比如说&#xf…

已解决AttributeError: module ‘gradio‘ has no attribute ‘outputs‘

问题描述 Traceback (most recent call last): File "/media/visionx/monica/project/ResShift/app.py", line 118, in <module> gr.outputs.File(label"Download the output")AttributeError: module gradio has no attribute outputs 解决办…

Java高级技术-单元测试

单元测试 Junit单元测试框架 Junit单元测试-快速入门 方法类 测试类 Junit框架的基本注解

同旺科技 USB TO SPI / I2C --- 调试W5500_Ping测试

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 设置寄存器&#xff1a; SHAR&#xff08;源MAC地址寄存器&#xff09;&#xff0c;该寄存器用来设置源MAC…

中国人工智能

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;作为一项前沿技术在各个领域展现出了强大的潜力。本文将探讨中国人工智能的历史、现状&#xff0c;并展望其未来发展。 人工智能的起源与历史 人工智能的概念最早诞生于1956年的美国达特茅斯学院的夏季研讨会…

231202 刷题日报

周四周五&#xff0c;边值班边扯皮&#xff0c;没有刷题。。 今天主要是做了: 1. 稀疏矩阵压缩&#xff0c;十字链表法 2. 快速排序 3.349. 两个数组的交集​​​​​ 4. 174. 地下城游戏 要注意溢出问题&#xff01;

KNN实战-图像识别

数据说明 是在循环0-9的数字一直循环500次所得到的数据&#xff0c;然后以手写照片的形式存在 识别的步骤 加载数据构建目标值构建模型参数调优可视化展示 加载数据 import numpy as np import matplotlib.pyplot as plt # 记载数据 data np.load(./digit.npy) data构建目…

【HDFS】调试慢节点pipiline ack信息

Client - DN1 - DN2 - DN3 DN3 send ack:[0][d3]。 DN2 send ack: [从dn2入队到收到dn3的ack耗时,0] [d2,d3]。 DN1 send ack: [pkt从dn1入队到收到dn2的ack耗时,pkt从dn2入队到收到dn3的ack耗时,0] [d1,d2,d3]。 Client receive: 就是DN1发送过来数据。 客户端收到的第一个…

000FreeCAD源码学习--MainGui.cpp

目录 1 MainGui.cpp源代码 2 int main()函数分析 3 编译运行截图 FreeCADMain项目下的MainGui.cpp 1 MainGui.cpp源代码 int main( int argc, char ** argv ) { #if defined (FC_OS_LINUX) || defined(FC_OS_BSD)setlocale(LC_ALL, ""); // use native environm…

【C++干货铺】继承 | 多继承 | 虚继承

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 继承的概念及定义 继承的概念 继承的定义 继承基类成员访问方式的变化 基类和派生类的赋值转化 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造…

判断是否有环形链表

问题描述&#xff1a; 给定一个链表&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0…

抖音视频如何无水印保存?抖音视频无水印保存教程

抖音视频如何无水印保存&#xff1f;当下短视频盛行时代&#xff0c;抖音作为当下主流短视频平台之一&#xff0c;每天都有数以亿计的用户在抖音上分享自己的创作&#xff0c;然后当我们遇到感兴趣的视频&#xff0c;下载保存后会发现带有水印&#xff0c;那么抖音视频如何无水…

scrapy介绍,并创建第一个项目

一、scrapy简介 scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使用了Twisted异步网络框架&#xff0c;可以加快我们的下载速度。 Scrapy文档地址&#xff1a;http://scrapy-chs.readthedocs.io/z…

LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

kubernetes中YAML介绍;API资源对象Pod;Pod原理和生命周期;Pod资源限制

YAML介绍&#xff1b;API资源对象Pod&#xff1b;Pod原理和生命周期&#xff1b;Pod资源限制 1&#xff09;认识YAML 官网&#xff08;https://yaml.org/&#xff09; YAML 语言创建于 2001 年&#xff0c;比 XML 晚了三年。YAML虽然在名字上模仿了XML&#xff0c;但实质上与…

剑指 Offer(第2版)面试题 14:剪绳子

剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子 剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子解法1&#xff1a;动态规划解法2&#xff1a;数学 剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子 题目来源…