【MySQL】事务 详解

news2025/1/11 19:59:20

事务 详解

  • 一. 为什么使用事务
  • 二. 事务的概念
  • 三. 使用
  • 四. 事务的特性
    • 原子性(Atomicity)
    • 一致性(Consistency)
    • 隔离性(Isolation)
    • 持久性(Durability)
  • 五. 事务并发所带来的问题
    • 脏读问题
    • 不可重复读
    • 幻(影)读
  • 六. 事务隔离级别

一. 为什么使用事务

假如说你要进行转账, 比如转给 张三 50元,先从你的账户里面扣除 50, 准备给 张三账户 + 50 时,数据库由于种种原因 挂了,没加上,此时 50 元 凭空消失了, 那么这就是一个比较悲伤的故事了,这种事情当然不能发生。

drop table if exists accout;
create table accout(
	 id int primary key auto_increment,
	 name varchar(20) comment '账户名称',
	 money decimal(11,2) comment '金额'
);

insert into accout(name, money) values
	('阿里巴巴', 5000),
	('四十大盗', 1000);

比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元

-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';

-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';

假如执行完第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上没有增加金额。

解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

二. 事务的概念

事务: 指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

事务的目的: 把若干个独立的操作打包成一个整体,这个整体要么全部成功执行, 要么一点都不执行。

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

有时前一个 SQL 是为了给后一个 SQL 提供支持,若后一个 SQL 不执行或者执行出现问题了, 前一个 SQL 也就失去意义了。

三. 使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。

start transaction;

-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';

commit;

四. 事务的特性

ACID
Atomicity: 原子性
Consistency: 一致性
Isolation: 隔离性
Durability: 持久性

原子性(Atomicity)

原子性: 任务不能被再细分,事务要么全部成功执行,要么一点也不执行,不会出现中间状态。

比如上面的转账例子, 不会出现 A账户 -2000, 结果数据库崩了/程序崩了/断电了, B 的账户并没有 + 2000 而导致的中间状态。

原子性如何保证 ?
该执行还得执行, 无法预知失败。
当出现执行失败后,由数据库自动进行一些 “还原” (回滚rollback)工作, 消除前面 已经执行过 的 SQL 带来的影响,使得看起来与没有执行一样。

比如:
当执行第二个 SQL 出现失败时,数据库会还原之前的操作,上一个是 +, 那么就 -, 是 * 就 / 。

数据库如何知道还原成哪个值呢?

日志, 数据库会把执行数据库的每个操作记录下来,整个记录过程搭配了 日志+数据库内置的一些表 来完成。

既然能还原,是不是就可以大胆的删库 了 ?
数据库想要记录详细的操作需要消耗大量的时间和空间,所以这个记录一定不会存储那么久,可能数据库是经过好几年沉淀出来的结果,但是日志只是记录最近几天的,所以还得依赖 权限控制 和 数据备份。

一致性(Consistency)

事务在执行前后,数据库从一个一致的状态转换到另一个一致的状态。这意味着事务必须遵循预定义的规则和约束,以确保数据的完整性。
如果事务违反了任何约束,它将被回滚,数据库不会处于不一致的状态。

隔离性(Isolation)

隔离性指的是多个事务同时运行时,每个事务都应该被视为独立的,不应该受到其他事务的干扰。
这意味着在并发执行的情况下,一个事务的操作不会对其他事务产生影响,直到事务提交为止。
数据库系统使用锁和其他机制来实现隔离性。

持久性(Durability)

持久性确保一旦事务提交成功,其结果将永久保存在数据库中,即使系统发生故障或重启。这意味着事务的结果不会因为系统崩溃而丢失,数据库系统必须将数据持久地写入磁盘或其他持久存储介质中。

总结:
事务的四个特性确保了数据库事务的可靠性和一致性,使得数据库系统能够有效地管理并发操作,同时保护数据免受损坏或丢失。但严格的ACID特性有时会对性能产生一定的开销,因此在某些情况下,可能需要权衡ACID特性与性能之间的关系。

五. 事务并发所带来的问题

并发: 包含并行和广义的并发。

当并发执行多个事务时, 尤其当这多个事务在尝试修改/读取同一份数据时,容易出现一些问题。
事务的隔离级别就是在解决该问题。

脏读问题

事务 A 在对某个数据进行修改,修改的时候,事务 B 读取了这个数据,此时事务 B 读取到的很可能只是一个临时的中间结果,不是最终结果, 那么此时 B 就是读到了 “脏数据”。

出现脏读的原因:
事务和事务之间没有隔离,加上一些限制,就可有效避免脏读。

解决脏读:
给写操作加锁,修改过程中, 不允许别人读, 修改之后才能读(解锁)。
(注意一旦加锁, 事务之间隔离性提高, 并发度降低)

不可重复读

不可重复读问题: 在一个事务中,包含多次读操作,多次读操作读出来的结果不一致

在这里插入图片描述

解决脏读问题时,只是约定写加锁, 写时不能读, 但是 读时还能写,所以还存在不可重复读问题。
这个问题好比:通过码云读代码,读的时候别人修改并提交了,我们刷新一下,代码变了。

解决:
约定读时也加锁,读时不能进行修改操作, 读时,其他事务能读但不能修改。

在这里插入图片描述

事务的隔离性进一步提高,并发性进一步降低

幻(影)读

幻读问题: 一个事务执行过程中进行多次查询,多次查询的结果集不一样,
结果集多了,这是一种特殊的不可重复读问题。

在这里插入图片描述

本例就是读代码时,代码数量变了,本来只有一个 A.java, 后面读取的时候发现又多了 B.java

注意:
幻读出现的场景:

第一:事务的隔离级别为可重复读。

第二:幻读仅专指新插入的行,在范围查询中,后一次查询出现了新的数据行。
(因为数据库中原本没有这个数据,当然就无法加锁了,所以会出现新的数据, 而因为读时不能写,所以不会删除数据)。

解决:
彻底串行化,读的时候不要写任何代码。
(但是在MySQL的InnoDB引擎中,通过间隙锁(gap lock)+行锁组成的next-key lock,在可重复读级别下解决了幻读的问题。参考链接:前阿里数据库专家总结的MySQL里的各种锁(下篇))

串行化,隔离级别最高,并发度最低(其实已经串行化,没有并发了),数据最可靠,但是执行速度最慢。

所以,并发性和隔离性不可兼得。
可根据实际需要调整数据库隔离级别,通过不同的隔离级别,控制事务间的隔离性和并发程度。

六. 事务隔离级别

在这里插入图片描述

(MySQL 默认隔离级别为 repeatable read, 通过修改 my.ini 文件可以设置当前隔离级别。)

好啦 ! 以上就是对 MySQL 事务的讲解, 希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

git 给分支添加描述

需求:分支多了不知道当前分支的用处可以使用git br用来描述 效果: 全局安装命令 npm i -g git-br 项目内使用 git br 给f-230825-4-zhou分支备注 git config branch.f-230825-4-zhou.description 用来开发第四迭代需求 再次git br查看效果

如何运用智能客服系统进行有效的客服分配?

企业竞争从最开始的拼竞争、拼功能到后来拼服务,现在又越来越多企业开始在客户体验方面展开竞争,谁能给客户带来优质的体验,谁赢得未来市场的可能性就更大。智能客服系统的应用则为企业提高客户服务质量贡献了大份力,其能够对客服…

华为云云服务器评测|老用户回归的初印象

华为云云服务器评测|老用户回归的初印象 前言一、新面孔1. 云耀云服务器2. 服务器特色 二、上手感官体验1. 性价比感受2. 推荐宝塔面板3. CloudShell登录4. 安全性 总结 前言 其实笔者接触华为云已经很久了,第一次使用的云服务器就是华为云。当时还是刚…

【AI】《动手学-深度学习-PyTorch版》笔记(二十二):单发多框检测(SSD)

AI学习目录汇总 1、介绍 SSD(Single Shot MultiBox Detector)单发多框检测。“Single shot”说明SSD算法属于one-stage(一段式)方法,“MultiBox”说明SSD是多框预测(多尺度锚框/特征图)。 SSD和YOLO一样都是采用CNN网络执行one-stage(一段式)检测,区别是: YOLO速…

【SpringMVC】参数传递与用户请求和响应

目录 一、Postman 工具使用 1.1 Postman安装 1.2 Postman的使用 1.2.1 创建WorkSpace工作空间 1.2.2 创建请求 二、参数传递 2.1 添加 Slf4j 依赖 2.2 普通传参 知识点1:RequestMapping 知识点2:RequestParam 2.3 路径传参 知识点3&#xff1…

Vue2电商前台项目——项目的初始化及搭建

Vue2电商前台项目——项目的初始化及搭建 Vue基础知识点击此处——Vue.js 文章目录 Vue2电商前台项目——项目的初始化及搭建一、项目初始化1、脚手架目录介绍2、项目的其他配置 二、项目的路由分析及搭建1、项目的路由分析2、开发项目的步骤3、非路由组件的搭建4、路由组件的搭…

大数据下的精准营销获客

2012年以后,大数据(big data)一词越来越多地被提及,人们用它来描述和定义信息爆炸时代产生的海量数据,并命名与之相关的技术发展与创新。哈佛大学社会学教授加里金说“这是一场革命,庞大的数据资源使得各个…

通过 Blob 对二进制流文件下载实现文件保存下载

原理&#xff1a;前端将二进制文件做转换实现下载: 请求后端接口->接收后端返回的二进制流(通过二进制流&#xff08;Blob&#xff09;下载,把后端返回的二进制文件放在 Blob 里面)->再通过file-saver插件保存 页面上使用&#xff1a; <span click"downloadFil…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

云原生架构如何助力大数据和AI技术在软件开发中的深度整合

文章目录 1. 云原生架构简介2. 大数据与云原生的融合a. 弹性计算和存储b. 容器化大数据应用c. 数据湖和数据仓库 3. AI与云原生的深度融合a. 弹性AI模型训练b. 容器化AI应用c. 自动化部署和监控 4. 对软件开发的影响a. 更快的开发周期b. 更低的成本c. 更高的灵活性和可伸缩性 5…

Activiti7工作流引擎:节点动态跳转

Activiti7中并没有实现从一个UserTask跳转到另一个UserTask&#xff0c;要实现节点之间自由跳转&#xff0c;需要通过自定义命令来实现。 Activiti7实现主要使用了命令模式(Command)和责任链模式(Intercepter)。 命令模式&#xff1a;主要是将每个操作封装成一个命令。如&…

什么是回调函数?写出一个示例?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 回调函数⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

Hadoop Hive入门

0目录 1.linux 安装hive 2.hive入门 3.hive高级语法1 1.linux 安装hive 先确保linux虚拟机中已经安装jdk&#xff1b;mysql和hadoop 并可以成功启动hadoop和mysql 下载hive对应版本到opt/install目录下并解压到opt/soft目录下 重命名 hive312 配置profile 文件&#xff…

结构体的简单介绍(3)——结构体的内存对齐

目录 结构体的内存对齐&#xff1a; 举例&提出疑问&#xff1f; 内存对齐&#xff1a; 对齐规则&#xff1a; 偏移数&#xff1a;类似于数组的下标&#xff0c;指的是结构体每个成员的首个地址距离结构体起始位置的距离。 用结构体内存对齐的图例示范&#xff1a;——…

【开发】安防监控/视频存储/视频汇聚平台EasyCVR优化播放体验的小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…

优化SOCKS5的方法

在今天的互联网世界中&#xff0c;保护个人隐私和提升网络速度至关重要。作为一种常用的代理协议&#xff0c;SOCKS5代理服务器不仅可以保护您的隐私&#xff0c;还可以实现更快速的网络访问。本文将为您介绍一些优化SOCKS5代理服务器的方法&#xff0c;以提高网络速度和安全性…

数据结构例题代码及其讲解-递归与树

树 ​ 树的很多题目中都包含递归的思想 递归 递归包括递归边界以及递归式 即&#xff1a;往下递&#xff0c;往上归 递归写法的特点&#xff1a;写起来代码较短&#xff0c;但是时间复杂度较高 01 利用递归求解 n 的阶乘。 int Func(int n) {if (n 0) {return 1;}else …

看涨期权计算例题(期权案例计算)

看涨期权又称认购期权&#xff0c;买进期权&#xff0c;买方期权&#xff0c;买权&#xff0c;延买期权&#xff0c;或“敲进”&#xff0c;是指期权的购买者拥有在期权合约有效期内按执行价格买进一定数量标的物的权利&#xff0c;下文为大家科普看涨期权计算例题&#xff08;…

【Redis】2、Redis持久化

Redis 高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…

【数论】容斥问题教程+符号含义+公式(c++)

容斥问题是什么 比如我们平常考试&#xff0c;我们会统计有几个语文及格&#xff0c;有几个数学及格&#xff0c;比如5个语文及格&#xff0c;2个数学及格&#xff0c;当然了&#xff0c;也会有大学霸两科都及格&#xff0c;比如1个人语文数学都及格&#xff0c;那我们班上一共…