【MySQL】事务|概念|如何回滚|基本特性|MySQL事务隔离性具体怎么实现的

目录

1.为啥引入

2.是啥

3.如何回滚(日志)

🔥4.面试题:谈谈事务的基本特性

(1)原子性

(2)一致性(收入和支出相匹配)

(3)持久性

🔥(4)隔离性

脏读问题

是什么?

如何解决?

不可重复读问题

是什么?

图解​编辑

如何解决?

幻读问题

是什么?

如何解决?


1.为啥引入

多个SQL配合,出现特殊情况,前面执行了,后面没执行

日常开发中,有很操作,不是通过一个SQL就能完成的,往往需要多个SQL配合完成,当执行多个SQL操作的时候,如果中间出现了特殊的情况(程序崩溃,系统崩溃,网络断开,主机掉电了...),就可能会出现前面SQL执行成功,后面的SQL执行失败了

举例(具体场景): 

库存表(id,count)

订单表(orderId,userId,goodId...)

进行下单操作,触发库表数据-1 && 订单表新增记录

经常会涉及到通过多个SQL配合,完成某个操作的

这个时候就需要使用到事务,来确保上述的操作,是可靠的,完整的


2.是啥

事务,就是把多个操作,打包成一个整体,就能够保证,这个整体要么都执行成功,要么就一个都不执行,有效避免部分执行,部分未执行,产生的一些”中间状态引起的问题“

原子性:把多个操作,打包成一个整体

Q1:什么叫”一个都不执行“的理解

A1:这里并不是真的没执行,事务中的若干个SQL必然是要一条一条执行的,事务能够保证,当执行到某一条的时候如果出现问题了(程序崩溃,系统崩溃,网络断开,主机掉电了...),数据库就能够自动的把前面SQL操作的影响,给恢复回去,看起来就好像一条SQL都没执行的样子

其实这里翻新的操作,成为”回滚

数据库事务的原子性,核心就是通过”回滚“机制来保证的


3.如何回滚(日志)

为了实现回滚机制,数据库会在执行事务的时候,记录日志,数据库的日志是写入到硬盘的文件

当事务最终都执行完毕,中间没有差错,这些记录的内容就可以不要了

但是如果执行事务的过程中,出现了问题,MySQL就可以根据日志中记录的内容,来进行恢复操作

1)之前进行了新增操作,就把数据删掉

2)之前进行了删除操作,就把数据新增上来

3)之前进行了修改操作,就把数据改回去

4)之前是查询操作,不影响,不需要任何恢复行为

只要数据库处于正常工作状态,就能够始终保证事务前面进行的操作被正确回滚(关系型数据库一般都能够支持这一点)

eg:

程序崩溃/网络断开:程序崩溃,但数据库是正常的,就直接进行回滚操作即可

系统崩溃/主机掉电了:这种情况MySQL服务器也挂了,那么无法立即回滚,过一段时间程序员把环境进行恢复的时候,数据库能重新启动的时候,就能够发现上次有个事务出问题了,按照前面记录的日志内容进行回滚


🔥4.面试题:谈谈事务的基本特性

(1)原子性

有回滚机制,能够触发还原

(2)一致性(收入和支出相匹配)

执行事务之前,和执行事务完毕之后,数据是一致的(不会出现这种”对不上“的情况)

也是和回滚有关的,一旦触发回滚了,回滚回去的数据得是对的;如果顺利执行,没有触发回滚,数据也是符合要求的

这个特性其实是对:”数据正确“的承诺

(3)持久性

执行事务对数据库产生的修改,就会在硬盘上持久保存,重启后仍然存在

但凡见到“持久性”就要联想到一件事:把数据存储在硬盘上

此处的持久,程序重启/主机重启。数据仍然能存在,但是如果存储在内存中,就不是持久的,内存中的数据会随着程序重启/主机重启而消息

Q1:数据不丢失和持久性一样吗

不丢失 = 持久性 + 一致性

🔥(4)隔离性

1)为何会有这个特性

如果多个客户端正好把事务赶到一块了,就需要数据库服务器都能给出处理,更糟糕的是,如果这多个事务都尝试操作同一个表,情况就会更复杂(并发处理的,这样速度比一个一个处理速度快)

2)如果一起同时处理,可能出现的问题

脏读问题
是什么?

数据库中,如果有事务A和事务B,事务A针对某个表做出了一些修改,在事务A提交之前(也就是commit告诉数据库服务器,事务完毕之前),事务B就对这里的数据进行了读取,最终就可能出现A后续操作又把上述数据进行了修改,导致最终B读到的数据和A提交的数据,是不同的

即事务B读到的是一个“临时数据”(也就是脏数据),临时数据可能会随时被修改掉

如何解决?

针对"写操作“加锁,A这边写的时候,B不能读,A写完了,B才能读

未加锁之前:执行A的同时,也能执行B(同时执行)

加锁后:执行A的过程中,B就不能执行了,要等待

这就相当于降低了”并发能力“,也就会降低数据库服务器的处理效率,提高了”隔离性“,也提高了数据的准确性

不可重复读问题
是什么?

存在三个事务.ABC.

事务A针对数据进行修改,提交;

接下来事务B进行读取数据(事务B这里的多个sql都要进行读操作);

在执行B的过程中又有一个事务C,又针对数据进行了修改

就会使B里面的不同读操作,读出来的结果不一样.

图解

开始读的数据和结束读的数据,存在差异 

如何解决?

引入读加锁,就会使“并发程度”又进一步降低,效率也随之降低“隔离性”又进一步提高,数据的准确性也会提高.这个时候,ABC都不能并发了.

幻读问题
是什么?

事务A先修改并提交数据,事务B进行读数据.此时事务C,没有修改B读的数据,但是给对应的表进行了新增数据/删除数据等操作..导致事务B中,读到的数据集不同(已有的数据内容是一致的,数都是据的条数增加/减少)

可以视为是“不可重复读”的特殊情况

简单理解:读的数据内容不变,但是数据量多了

而不可重复读:读的数据内容变了

如何解决?

解决幻读的方式,“串行化”使所有的事务都严格的按照“一个接一个”的方式执行.完全没有并发了.此时执行效率是最低的,隔离性也是最高的,数据也是最准确的. 

小结:

<1> 脏读:事务B读到了事务A中未提交的临时数据(脏数据) => 写加锁

<2> 不可重复读:事务B读的过程中,又有事务C对刚才事务A提交的数据进行了修改,使事务B内部不同的读操作读到的结果不同  =>读加锁

<3> 幻读:和不可重复读类似,事务B读的过程中,事务C没有修改数据内容,而是修改了”结果集“,导致B内不同的读操作读到的结果集合不同 => 串行化

解决上述问题过程中,要想让数据更准确,就需要牺牲一部分的并发/效率

3)MySQL事务隔离性具体怎么实现的

MySQL给程序员提供了四个隔离级别,可以在MySQL中配置文件中进行设置

<1> read uncommitted:允许读取其他事务未提交的数据 

-> 脏读 + 不可重复读 + 幻读  (并发程度最高,隔离性最低)

<2> read committed:只能读取其他事务提交后的数据

-> 解决了脏读,存在不可重复读+幻读 (并发程度低,隔离性提高)

<3> repeatable read:针对读操作和写操作都加锁了

-> 解决了脏读 + 不可重复读,存在幻读 (并发程度又低,隔离性又提高)

<4> 串行化(serializable):所有的事务都是串行执行的

-> 解决了脏读 + 不可重复读 + 幻读 (并发基本没有,隔离性最高)

修改MySQL的配置文件,使MySQL服务器处于某个隔离级别中来运行

eg:

做一个和钱有关的系统,可以设置成串行化

做一个短视频点赞系统,就可以设置成读未提交,追求最大的效率

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

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

相关文章

C语言中的选择结构:决策的艺术

目录 一、选择结构的概念与意义 二、if语句 1. 基本语法 2. 示例代码 三、if-else语句 1. 基本语法 2. 示例代码 3. 嵌套if-else语句 四、switch语句 1. 基本语法 2. 示例代码 五、选择结构的注意事项 1. 条件表达式的正确性 2. if-else语句的配对问题 3. switch…

【0013】Python数据类型-列表类型详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; Python列表&#xff0c;作为编程中的基础数据结构&#xff0c;扮演着至关重要的角色。它不仅能够存储一系…

SwanLab简明教程:从萌新到高手

目录 1. 什么是SwanLab&#xff1f; 1.1 核心特性 2. 安装SwanLab 3. 登录SwanLab账号&#xff08;云端版&#xff09; 4. 5分钟快速上手 更多案例 5. SwanLab功能组件 5.1 图表视图 5.2 表格视图 5.3 硬件监控 5.4 环境记录 5.5 组织协同 6. 训练框架集成 6.1 基…

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…

【SegRNN 源码理解】【今天不水文系列】编码器部分理解

我来小小的理解一下&#xff1a; 首先&#xff0c;16 batchsize&#xff0c;60sequendcelength&#xff0c;7 个特征的通俗解释 16 个独立的样本&#xff0c;每个样本有 60 个连续的时间步及对应的标签值&#xff0c;每个时间步有 60 个特征 所以就是因为样本是随机从训练集…

【CUDA】Reduce归约求和(下)

目录 前言1. 优化技巧4&#xff1a;展开最后一个warp减少同步2. 优化技巧5&#xff1a;完全展开循环3. 优化技巧6&#xff1a;调节GridSize和BlockSize4. 优化技巧7&#xff1a;使用shuffle指令5. 拓展—CUDA工具链的使用结语下载链接参考 前言 学习 UP 主 比飞鸟贵重的多_HKL …

IDE集成开发环境MyEclipse中安装SVN

打开Myeclipse的help菜单----install from site 点击add弹出对话框 在输入框中输入对应内容 http://subclipse.tigris.org/update_1.10.x 点击OK之后&#xff0c;会刷新出两个选项&#xff0c;需要选中的 点击next&#xff0c;出现许可的时候选中同意&#xff0c;一直结束等…

如何计算两个向量的余弦相似度

参考笔记&#xff1a; https://zhuanlan.zhihu.com/p/677639498 日常学习之&#xff1a;如何计算两个向量或者矩阵的余弦相似度-CSDN博客 1.余弦相似度定理 百度的解释&#xff1a;余弦相似度&#xff0c;又称为余弦相似性&#xff0c;是通过计算两个向量的夹角余弦值来评估…

国产编辑器EverEdit - 宏功能介绍

1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器&#xff0c;可以让用户愉快的从繁琐的工作中解放出来&#xff0c;其本质是对键盘和菜单的操作序列的录制&#xff0c;并不会识别文件的内容&#xff0c;属于无差别无脑执行。 特别是对一些有规律的重复按键动作&#xff0c;…

vue安装stylelint

执行 npm install -D stylelint postcss-html stylelint-config-recommended-vue stylelint-config-standard stylelint-order stylelint-prettier postcss-less stylelint-config-property-sort-order-smacss 安装依赖&#xff0c;这里是less&#xff0c;sass换成postcss-scss…

(最新教程)Cursor Pro订阅升级开通教程,使用支付宝订阅Cursor Pro Plus

一、如何使用Cursor &#xff1f; 目前要使用Cursor - The AI Code Editor&#xff0c;直接去下载安装就可以了&#xff0c;不过基础版只能用两周&#xff0c;如果需要继续使用&#xff0c;就要订阅pro plus或者企业版了。 二、如何订阅Cursor Pro Plus &#xff1f; 因为基础…

Cursor 使用经验,一个需求开发全流程

软件开发中 Cursor 的使用经验成为关注焦点&#xff0c;尤其是处理大型数据集的需求。用户提到“Cursor 使用经验&#xff0c;一个需求开发全流程”&#xff0c;但“Cursor”可能指数据库游标&#xff0c;涉及逐行处理数据。本文将详细探讨开发一个需求的完整流程&#xff0c;包…

vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui时&#xff0c;如何每个组件都去import导入组件&#xff0c;大大降低了开发效率&#xff0c;如果全局一次性注册会增加项目体积&#xff0c;那么如何实现既不局部引入&#xff0c;也不全局注册&#xff1f; 2.在element-plus官网看到有说明…

蓝桥杯备赛:一道数学题(练思维(同余的应用))

题目&#xff1a;请问由1-8组成的8位数中有多少个数字可以被1111整除&#xff1f; 首先这道题目看着很难&#xff0c;如果我们直接用代码做的话&#xff0c;也要跑很久&#xff0c;那能不呢想想有什么样的思路可以巧妙一点解开这道题目呢&#xff1f; 有的兄弟有的 这道题目的…

[Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III

目录 1. 数组中的第K个最大元素 题解 代码 2.库存管理 III 代码 1. 数组中的第K个最大元素 题目链接&#xff1a;215. 数组中的第K个最大元素 题目分析&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要…

Unity引擎使用HybridCLR(华佗)热更新

大家好&#xff0c;我是阿赵。   阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司&#xff0c;在面试的时候很重要的一个点&#xff0c;就是会不会用Lua。使用Lua的原因很简单&#xff0c;就是为了热更新。   热更新游戏内容很重要。如果…

【神经网络】python实现神经网络(一)——数据集获取

一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中&#xff0c;我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程&#xff0c;现在我们正式开始进行代码的实现&#xff0c;首先我们来实现第一步的运算过程模拟讲解&#xff1a;正向传导。本次代…

【Linux】冯诺依曼体系与操作系统理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充&#xff1a;理解系统调用…

HTML-网页介绍

一、网页 1.什么是网页&#xff1a; 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML 格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素&#xf…

STM32——GPIO介绍

GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…