【MySQL篇】事务的认识以及四大特性

news2025/2/8 19:03:22

何为事务?

事务(Transaction)是指一组操作的集合,这些操作要么全部执行成功,要么全部不执行。事务通常用于保证数据库的一致性、完整性和可靠性,确保数据的完整性与正确性。

有效避免部分执行,部分未执行而引起的问题;

引入例子:

**假设以下场景:**转账
第一步A用户转账给B用户100元 账户-100

-- 从账户A扣款
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';

第二步B用户收到A转账100元 账户+100

-- 向账户B存款
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';

此时如果第一步完成之后,由于受到各种原因,例网络波动,主机关机,MySQL服务器崩溃等等因素,导致第二步未操作,这可损失大了,A凭空丢失100,所以这种情况是不允许发生的。

此时由于是俩个操作,所有MySQL会将这俩个操作打包成一个操作(原子性),要么一起完成,要么都不完成。

如果中途发生异常,此时操作将会进行“回滚”操作,所有操作将会被撤销。

补充:MySQL会将每一步操作都会记录在MySQL的日志中,所以可以根据日志里面的内容进行还原操作

在 MySQL 中,事务是由多个 SQL 语句组成的一个操作单元,要么所有的操作都成功执行(提交,commit),要么在发生错误时,所有操作都不执行(回滚,rollback)。通过事务,MySQL 能够提供更强的错误恢复能力,并保证数据库在并发访问时的一致性。


事务的四大特性:

事务有四个核心特性,通常被称为 ACID 特性:原子性(Atomicity),一致性(Consistency),持久性(Durability),隔离性(Isolation);

原子性:

在上述操作中,将多个操作打包成一个操作时,此时代表这个操作具有“原子”的,原子就是以前最小的单位,不可拆分。

事务中的操作要么全部成功,要么全部失败。原子性确保了事务是最小的执行单位,无法再分割。即使在事务执行的过程中发生故障,数据库也会通过回滚操作使事务的状态恢复到事务开始之前。


一致性:

在执行事务开始前后,要保证数据是一致的,不会出现对不上的情况。一旦触发“回滚”操作,也要保证回滚回去的数据跟原来一样;

事务执行前后,数据库的状态必须从一个一致的状态转变到另一个一致的状态。所有事务都必须遵循数据库的完整性约束,如主键、外键等,确保数据的完整性和准确性。


持久性:

一旦事务提交,它对数据库的更改是永久性的,即使发生系统崩溃或断电,提交的事务所做的更改也会保留下来。


隔离性:

在并发环境下,多个客户端同时对服务器发起事务请求,一个事务的执行不应受到其他事务的干扰。每个事务应该像是在独占数据库一样执行,直到它提交或回滚。

在并发环境下,可能会产生以下问题:脏读,不可重复读,幻读;


脏读:

脏读指的是一个事务读取了另一个事务尚未提交的数据。这可能会导致读取到不一致的数据,因为另一个事务可能回滚,使得当前事务读取的数据变得无效。

例子:
假设有一场随堂考试,小明(学渣)抄袭小强(学霸)的试卷(这种行为是不好的,只是比喻),此时小强写完了试卷给小明抄,小明写着写着写完了之后,小明就直接提交试卷了。但小强在检查试卷的时候,发现检查试卷的时候很多答案填错了,那么小强肯定将答案改正了回来
**,而小明吃了大亏,心里想我*****,还不如自己写…**

核心在于:当小强不仅写完试卷,并且还检查完毕,确保不会修改的情况下,小明再去抄写他的答案,不然都可能出错

解法方法:

当事务B查看事务A(写操作)的数据时候,将事务A的数据进行“加锁”,此时事务B不能查看A的数据,必须等待事务A确定下来,才可以查看。
这就相当于降低了 ‘并发能力’,也就降低了数据库服务器的处理效率,提高了 ‘隔离性’ ,也提高了数据的准确性。在并发执行事务过程中,相互之间是互相影响的,彼此的影响越小,隔离性越高;反之影响越大,隔离性越低。


不可重复读

在上述基础上,我们已经把写操作加上锁,这就意味着读操作的事务不能中途查询,以免没有查询到最终结果。

例子:
当我们写博客的时候,此时读者必须等我们发布完成之后,才能阅读我们的博客。

假设我们写完已经发布了 这是事务A

然后读者去查看博客的内容 这是事务B

当我们发布完 我们还觉得内容需要修改一下 可能存在一点问题 又进行发布了这是事务C

问题出现在事务B此时在读数据的时候,此时我们事务C也执行了,假设博客页面刷新了,事务B发现此时读到的数据跟刚才读到的数据不一样,这就是不可重复读问题;

解法:

在事务B读操作的时候 ,我们也不能执行事务C,必须等事务B执行完之后,才能修改数据,也就是说在“读数据”的时候也不能“写数据”;

**所以对事务B读操作也加上“锁”,**就可以保证事务 B 前后两次读取的数据都是一致的。

脏读和不可重复读的区别:

  • 脏读关注的是一个事务读取另一个事务未提交的数据,且这个数据可能最终会被回滚,因此它是不可靠的。
  • 不可重复读关注的是同一个事务内,在多次读取同一数据时,数据发生了变化(通常是由于其他事务的提交),导致读取结果不一致。

幻读:

幻读是指一个事务在查询数据时,其他事务可能插入、删除或修改记录,导致该事务查询的数据集发生变化,即查询结果出现"幻象"。在一个事务中,查询的结果集在不同的查询操作之间可能不一致。

例子:

刚才约定对读和写操作进行加上锁。

事务A发布第一篇博客

事务B在查询****博客的内容

此时我们并不修改第一篇博客的内容,闲着也是闲着,于是我们继续写了新的一篇博客,第二篇博客。 事务C

在B再一次查询的时候,发现了多出来了一篇博客,此时就是幻读。

解法:

当读者在阅读博客的时候,叫我们啥事别做了,好好休息,简单来说,就是一个事务一个事务来,在执行事务的时候,不要执行任何操作;

实现串行化操作,此时没有并发了,因此效率最低,并且也是隔离性最高的,数据是最准确的。


隔离性的隔离级别:

隔离级别

脏读

不可重复读

幻读

适用场景

读未提交(Read Uncommitted)

高并发、无需完全一致性的数据场景

读已提交(Read Committed)

适用于实时性要求较高的场景

可重复读(Repeatable Read)

适用于大部分应用,默认隔离级别

串行化(Serializable)

保证最大程度的一致性,但性能最低

总结
  • 脏读不可重复读幻读都是由于并发事务互相干扰所导致的问题。为了避免这些问题,可以选择合适的事务隔离级别:
    • 读未提交:出现脏读,不可重复读,幻读。
    • 读已提交:防止脏读,但可能会出现不可重复读和幻读。
    • 可重复读:防止脏读和不可重复读,但可能会出现幻读。
    • 串行化:完全避免所有并发问题,但性能最差。

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

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

相关文章

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器,其特点是…

【算法专场】分治(下)

目录 前言 归并排序 思想 912. 排序数组 算法思路 算法代码 LCR 170. 交易逆序对的总数 算法思路 算法代码 315. 计算右侧小于当前元素的个数 - 力扣(LeetCode) 算法思路 算法代码 493. 翻转对 算法思路 算法代码 好久不见~时隔多日&…

OSPF基础(2):数据包详解

OSPF数据包(可抓包) OSPF报文直接封装在IP报文中,协议号89 头部数据包内容: 版本(Version):对于OSPFv2,该字段值恒为2(使用在IPV4中);对于OSPFv3,该字段值恒为3(使用在IPV6中)。类型(Message Type):该OSPF报文的类型。…

Docker Desktop安装kubernetes时一直在Starting:Kubernetes failed to start

原因:由于墙的问题,导致拉取国外的K8s镜像失败 解决: 下载 k8s-for-docker-desktop 选中自己的kubernetes 版本 下载zip包 PowerShell运行load_images.ps1文件 重启docker kubernetes运行成功

StarSpider 星蛛 爬虫 Java框架 可以实现 lazy爬取 实现 HTML 文件的编译,子标签缓存等操作

StarSpider 星蛛 爬虫 Java框架 开源技术栏 StarSpider 能够实现 针对 HTML XSS SQL 数学表达式等杂乱数据的 爬取 解析 提取 需求! 目录 文章目录 StarSpider 星蛛 爬虫 Java框架目录介绍如何获取?maven配置 架构是什么样的?结果对象的类…

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…

动态规划LeetCode-121.买卖股票的最佳时机1

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

import { Component, Vue, Prop, Watch } from ‘vue-property-decorator‘

文章目录 导入部分的解释总结Vue 3 的推荐替代方案总结 你提供的代码片段是使用 vue-property-decorator 库的示例,这是一个第三方库,它提供了 Vue 组件的装饰器,使得编写类风格的 Vue 组件更加方便。以下是对代码中每个部分的详细解释&…

X Window System 架构概述

X Window System 架构概述 1. X Server 与 X Client ​ 这里引入一张维基百科的图,在Linux系统中,若用户需要图形化界面,则可以使用X Window System,其使用**Client-Server**架构,并通过网络传输相关信息。 ​ ​ X…

【ArcGIS Pro 简介1】

ArcGIS Pro 是由 Esri (Environmental Systems Research Institute)公司开发的下一代桌面地理信息系统(GIS)软件,是传统 ArcMap 的现代化替代产品。它结合了强大的空间分析能力、直观的用户界面和先进的三维可视化技术…

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全

2月7日,启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF(Model Application Firewall)大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…

小米AI眼镜官微上线,将与小米15 Ultra同台亮相,近屿智能用心培育 AI 人才

近日,小米眼镜官微已正式上线,认证主体为小米通讯技术有限公司。据悉,小米AI眼镜已获得入网许可,并计划提前至2月发布,与小米15 Ultra同台亮相。 此前,小米AI眼镜原定于2025年3月至4月发布。早在去年&#…

Mac下使用brew安装go 以及遇到的问题

首先按照网上找到的命令进行安装 brew install go 打开终端输入go version,查看安装的go版本 go version 配置环境变量 查看go的环境变量配置: go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录,在该目录中新建…

在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?

在rtthread源码中,每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口, 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中: 在tools下所有模块中,最重要的是building.py模块,在此脚本里面…

Unity游戏(Assault空对地打击)开发(7) 爆炸效果

效果 准备 首先请手搓一个敌军基地。 然后添加一个火焰特效插件或者自建。 爆炸脚本编写 新建一个脚本命名为Explode。 无需挂载到对象上。 首先是全部代码。 using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine…

嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思…

excel实用问题:提取文字当中的数字进行运算

0、前言: 这里汇总在使用excel工作过程中遇到的问题,excel使用wps版本,小规模数据我们自己提取数据可行,大规模数据就有些难受了,因此就产生了如下处理办法。 需求:需要把所有文字当中的数字提取出来&…

【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…

昇思打卡营第五期(MindNLP特辑)番外:硅基流动 x 华为云DeepSeek V3 API推理MindTinyRAG

1.前言 前脚,DeepSeek面临的巨头企业官宣加入vs多国政府下场质疑的冰火两重天局势尚未平静(DeepSeek在美两重天:五大巨头接入,政府诚惶诚恐);后脚,OpenAI被逼急,凌晨亮出全新推理…