【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:

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

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

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

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

相关文章

deepseek 本地部署

deepseek 本地部署 纯新手教学&#xff0c;手把手5分钟带你在本地部署一个私有的deepseek&#xff0c;再也不用受网络影响。流畅使用deepseek&#xff01;&#xff01;&#xff01; 如果不想看文章&#xff0c;指路&#xff1a;Deep seek R1本地部署 小白超详细教程 &#xff0…

⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II

⭐算法OJ⭐N-皇后问题【回溯剪枝】&#xff08;C实现&#xff09;N-Queens 问题描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…

关联封号率降70%!2025最新IP隔离方案实操手册

高效运营安全防护&#xff0c;跨境卖家必看的风险规避指南 跨境账号管理的核心挑战&#xff1a;关联封号风险激增 2024年&#xff0c;随着全球电商平台对账号合规的审查日益严苛&#xff0c;“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…

pytest框架 核心知识的系统复习

1. pytest 介绍 是什么&#xff1a;Python 最流行的单元测试框架之一&#xff0c;支持复杂的功能测试和插件扩展。 优点&#xff1a; 语法简洁&#xff08;用 assert 替代 self.assertEqual&#xff09;。 自动发现测试用例。 丰富的插件生态&#xff08;如失败重试、并发执…

搭建BOA服务器

BOA服务器是嵌入式常用的服务器类型&#xff0c;嵌入式程序作为后端时候如果想配合网页进行显示&#xff0c;利用BOA服务器搭建网络界面是不错的选择 首先下载boa官方安装包 Boa Webserver 下载后传输到Ubuntu随便文件夹&#xff0c;解压 tar -xvf boa-0.94.13.tar.gz 进入…

C# OPC DA获取DCS数据(提前配置DCOM)

OPC DA配置操作手册 配置完成后&#xff0c;访问远程ip&#xff0c;就能获取到服务 C#使用Interop.OPCAutomation采集OPC DA数据&#xff0c;支持订阅&#xff08;数据变化&#xff09;、单个读取、单个写入、断线重连

Ubuntu20.04搭建gerrit code review

一、环境准备 1. 安装 Java 环境‌ Gerrit 依赖 Java 运行环境&#xff08;推荐 JDK 8&#xff09;&#xff1a; sudo apt install openjdk-11-jdk 验证安装&#xff1a; java -version ‌2. 安装 Git sudo apt install git ‌3. 可选依赖 数据库‌&#xff1a;Gerrit …

【FSM-3: 串行序列】

FSM-3&#xff1a;串行序列 1 Serial receiver FSM使用总结&#xff1a; 所有涉及输出的driver原则上用cur_sta&#xff1b;若是使用nxt_sta的相当于是提前一拍知道结果&#xff0c;所以对于输出必须要使用clocked reg&#xff0c;这样才能和cur_sta对应起来&#xff1b;描述声…

蓝桥杯 之 前缀和与查分

文章目录 题目求和棋盘挖矿 前缀和有利于快速求解 区间的和、异或值 、乘积等情况差分是前缀和的反操作 前缀和 一维前缀和&#xff1a; # 原始的数组num,下标从1到n n len(num) pre [0]*(n1) for i in range(n):pre[i1] pre[i] num[i] # 如果需要求解num[l] 到num[r] 的区…

国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡

基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡 一、板卡概述 本板卡基于 FPGAJFM7K325T 芯片&#xff0c;pin_to_pin兼容FPGAXC7K410T-2FFG900 &#xff0c;支持PCIeX8、64bit DDR3容量2GByte&#xff0c;HPC的FMC连接器&#xff0c;板卡支持PXIE标准协议&#xff0c;其中XJ3…

计算机视觉之dlib人脸关键点绘制及微笑测试

dlib人脸关键点绘制及微笑测试 目录 dlib人脸关键点绘制及微笑测试1 dlib人脸关键点1.1 dlib1.2 人脸关键点检测1.3 检测模型1.4 凸包1.5 笑容检测1.6 函数 2 人脸检测代码2.1 关键点绘制2.2 关键点连线2.3 微笑检测 1 dlib人脸关键点 1.1 dlib dlib 是一个强大的机器学习库&a…

一周学会Flask3 Python Web开发-SQLAlchemy连接Mysql数据库

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili app.py下&#xff0c;我们先配置数据库连接&#xff0c;然后写一个简单sql测试。 连接配置&#xff0c;包括用户名&#xff…

blender看不到导入的模型

参考&#xff1a;blender 快捷键 常见问题_blender材质预览快捷键-CSDN博客 方法一&#xff1a;视图-裁剪起点&#xff0c;设置一个很大的值 方法二&#xff1a;选中所有对象&#xff0c;对齐视图-视图对齐活动项-选择一个视图

CES Asia 2025增设未来办公教育板块,科技变革再掀高潮

作为亚洲消费电子领域一年一度的行业盛会&#xff0c;CES Asia 2025&#xff08;第七届亚洲消费电子技术贸易展&#xff09;即将盛大启幕。今年展会规模再度升级&#xff0c;预计将吸引超过500家全球展商参展&#xff0c;专业观众人数有望突破10万。除了聚焦人工智能、物联网、…

【目标检测】【NeuralPS 2023】Gold-YOLO:通过收集与分发机制实现的高效目标检测器

Gold-YOLO&#xff1a; Efficient Object Detector via Gather-and-Distribute Mechanism Gold-YOLO&#xff1a;通过收集与分发机制实现的高效目标检测器 0.论文摘要 在过去的几年中&#xff0c;YOLO系列模型已成为实时目标检测领域的领先方法。许多研究通过修改架构、增强数…

利用python实现对Excel文件中数据元组的自定义排序

问题引入&#xff1a; 假设你是一个浙江省水果超市的老板&#xff0c;统筹11个下辖地市的水果产量。假设11个地市生产的水果包括&#xff1a;苹果、香蕉和西瓜。你如何快速得到某种水果产量突出&#xff08;排名前几&#xff09;的地市&#xff1f;产量落后&#xff08;排名后…

数学建模笔记——层次分析法(AHP)

本文借鉴了数学建模清风老师的视频和课件,如有错误欢迎大家批评指正。原视频地址:清风数学建模:https://www.bilibili.com/video/BV1DW411s7wihttps://www.bilibili.com/video/BV1DW411s7wi 1.预备知识 层次分析法: 层次分析法(The Analytic Hierarchy Process,AHP)是一…

koa-session设置Cookie后获取不到

在谷歌浏览器中请求获取不到cookie问题之一&#xff08;谷歌安全策略&#xff09; 场景 前端使用 axios 请求&#xff0c;项目地址&#xff1a;http://192.168.8.1:5173 import axios from axiosconst request axios.create({baseURL: http://127.0.0.1:3001/,timeout: 60000,…

Greenplum6.19集群搭建

一&#xff0c;安装说明 1.1环境说明 1、首先确定部署的环境&#xff0c;确定下服务器的端口&#xff0c;一般默认是22的端口&#xff1b; 2、当前这份文档是服务器处于10022端口下部署的&#xff08;现场生产环境要求&#xff0c;22端口在生产环境存在安全隐患&#xff09;&…

SAP DOI EXCEL宏的使用

OAOR里上传EXCEL模版 屏幕初始化PBO创建DOI EXCEL对象&#xff0c;并填充EXCEL内容 *&---------------------------------------------------------------------* *& Module INIT_DOI_DISPLAY_9100 OUTPUT *&--------------------------------------------…