MySQL 事务

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL 事务

引入



1. 什么是计算机中的事务


事务的定义:在一个业务中,有很多操作步骤 / 任务,而事务对应的就是某项操作中不可再分割的单元,这个单元要么全部执行完,要么不执行。


MySQL 事务:一条 SQL 语句所产生的增删查改操作。(或是多条 SQL 语句、整个程序所产生的结果)


2. 计算机中为什么需要事务


举个经典的转账例子,看看使用事务和不使用事务之间的区别。


小明有 500 元,小红也有 500 元,现在正常情况下,小明转出 200 元,余额为 300;小红收到 200 元,余额为 700 元。


7d3a234c739e45bf9a8f597017594fbe.png


不使用事务和使用事务,两者的对比:


b7d7c841dc2a40d4922dc5d88fbae121.png


一、事务


1. 事务的回滚 (roll back)


事务的回滚:当程序出现异常,系统将将程序恢复到上一次状态的行为。


比如:上面转账系统出现问题时,系统重新将小明转出去的 200 元数据,又返回给了小明的账户中。


在 MySQL 数据库中,其实也是一样的,若增删查改数据库的过程中,出现了异常,系统就会自动将数据回滚,做到了间接的 " 不污染数据库 "。


2. 事务的基本特性 (ACID)


(1) 原子性 (Atomicity)


原子性又被称为不可分割性。


原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。如果事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。


在 MySQL 数据库的操作中表示:要么将这个操作所用到的 SQL 全部执行完,要么一个 SQL 都不执行。


(2) 一致性 (Consistency)


一致性:在事务执行前后,数据库的完整性没有被破坏。这表示事务增删改查的数据必须完全符合所有的预设规则,即数据库中的数据都是合理合法的。


比方说:还是上面的转账的例子,事务需要遵循程序的规则,在不出现意外的情况下,小明给小红转了 200 元,那么小明就只能剩下 300 元,而小红的存款就必须得是 700 元。即事务执行前后,遵循数据严格的传输规则。


(3) 持久性 (Isolation)


持久性:一旦事务执行结束后,那么它对数据的增删改查就是永久的,即便系统故障也不会丢失。


(4) 隔离性 (Durability)


隔离性:数据库允许多个并发事务同时对其数据进行增删改查,隔离性可以防止多个事务并发执行时,而由于交叉执行所导致数据的不一致的情况。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化。


二、并发与串行的概念



事务的隔离级别和事务的隔离性是息息相关的,隔离是相对于并发来说的,而并发的反面就是串行。所以说,隔离就是不同程度的并发。


举个例子:


情况(1):大学辅导员在班级群里发了一个在线文档,让同学们填。因为是在线的文档,所以每个同学都可以在同一时间内输入自己的信息,这就是并发执行。


情况(2):如果说,辅导员让同学们排队,一个一个地填写纸质的表格,那么这时候,就是串行,也叫做序列化。


结论: 可以看到,并发执行速度快,所有同学可以在最短的时间内填好表格,但可能会发生 " 同学A " 把信息填写到 " 同学B " 那一栏的表格的这种错误情况。而后者串行速度慢,但是每个同学填写表格之间互相不影响,基本不会出错。


问:既然并发和串行都有自己的优缺点,那么能不能 " 取其精华、去其糟粕 " 呢?

答:要做到完全融合两者的优点是不可能的!但在实际问题中,我们可以根据实际需要来调整数据库的隔离级别,通过不同的隔离级别控制事务之间的隔离性,同时也就控制了并发程度。


三、并发事务所产生的问题



并发事务所产生的问题也就是对应着 MySQL 中事务的隔离级别。


1. 脏读


脏读:事务A 读取到了 事务B 未提交保存的数据,之后 事务B 进行了回滚操作,从而导致 事务A 读取了一个不存在的脏数据。


举个例子:大学辅导员让班长创建一个在线文档, 统计一下全班的学号,班里总共有30 人,但文档统计到 20 个人的时候,班长就提交给了辅导员,后来班长检查后发现文档没填完,于是就将在线文档撤回了。然而,恰巧此时,辅导员读取到了这个不完整的文档,那么这就是一份临时的脏数据。


2. 不可重复读


不可重复读:在同一个事务中,同一个查询操作在不同的时间得到了不同的结果。

举个例子:在同一个事务中,同一个查询操作在 t1时刻、t2 时刻,得到了不同的结果,这是因为在 t1 和 t2 时刻之间,有另一个事务对数据进行了修改。


3. 幻读


幻读:一个事务执行的过程中进行了多次查询,多次查询的结果都不一样,可能多了一行记录或少了一条记录,这种操作是一种特殊的不可重读读。


比方说:还是上面那个大学辅导员让班长创建一个在线文档的例子,当班长让30 位同学填写数据,然而,班长临时有事,当学号填写到10 号的时候,班长检查了一下没问题,他就交给了副班长去处理这件事情。但副班长不知道有没有填完,就直接把在线文档发给辅导员了,辅导员接收文件后,发现文档不完整,又打回去重新弄。之后,副班长有事,让学习委员来处理这件事,同样地,当学号填写了 20号的时候,学习委员就把文档交给辅导员了,最后又被打回来了。而辅导员第一次读的文档是 10个同学的,第二次读的文档是 20个同学的,它们都是错误的信息…这就是幻读问题。


注意事项


虽然幻读和不可重复读很像,但不可重复读侧重于数据修改,两次读取到的同一行数据不一样;而幻读侧重于添加或删除,两次查询的 MySQL 记录行数不同。


不可重复读:


172878eca1294be6a6563fb0bc19dda9.png


幻读:


b2854ac9b5764e2f8a4bfe3e3ad35131.png


解决方式


那么如何解决以上三种方式呢?

选择串行的方式,完全禁止并发事务的发生。


解决方式:大学辅导员可以让班长画一张 30 个格子的表格,让每个同学排队,线下填写表格,前一个同学填好了表格,就把表格拿给下一位同学,直至最后一位同学填好了给班长,班长检查正确无误之后,再提交给辅导员。


四、MySQL中事务的隔离级别



MySQL中事务的隔离级别,提供了四种:


1. 读未提交 (read uncommitted)


读未提交 (也叫未提交读):在该隔离级别中,事务A 可以读取到事务B 中未提交的数据。鉴于此,若 事务B 未提交的数据发生了回滚操作,那么 事务A 就直接读到了错误的数据,由此产生的问题称之为脏读。


也就是说,读未提交使得事务之间隔离级别最低,所以并发程度最高,但会引入脏读问题。进而引入不可重复读、幻读问题。


2. 读已提交 (read committed)


读已提交 (也叫提交读):在该隔离级别中,事务能读取到已经提交事务的数据,因此它不会有脏读问题。然而鉴于此,一个事务在不同时间的相同 SQL 查询中,可能会得到数据内容不同的结果,这种问题称之为不可重复读。


也就是说,读已提交使得事务之间隔离级别依旧较低,所以并发程度也就较高,但它解决了脏读问题。引入不可重复读问题,进而引入了幻读问题。


3. 可重复读 (repeatable read)


可重复读:MySQL 默认的事务隔离级别。 可重复读有效地解决了 " 不可重复读 " 的问题,但还存在幻读的问题。所谓的幻读指的是,在同一事务的不同时间使用相同 SQL 查询时,会产生不同的记录数目。


4. 串行化 / 序列化 (serializable)


串行化:事务最高隔离级别。它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题。但其执行效率低,所以真正使用的场景并不多。


小结


d05518d6498840768d2d771e4a23845d.png


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
MySQL基础:事务
本文详细介绍了数据库事务的概念及操作,包括事务的定义、开启、提交与回滚。事务作为一组不可分割的操作集合,确保了数据的一致性和完整性。文章还探讨了事务的四大特性(原子性、一致性、隔离性、持久性),并分析了并发事务可能引发的问题及其解决方案,如脏读、不可重复读和幻读。最后,详细讲解了不同事务隔离级别的特点和应用场景。
45 4
MySQL基础:事务
|
25天前
|
SQL 关系型数据库 MySQL
Mysql原理与调优-事务与MVCC
【8月更文挑战第19天】
|
29天前
|
存储 SQL 关系型数据库
深入解析MySQL事务机制和锁机制
深入解析MySQL事务机制和锁机制
|
1月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
45 2
|
14天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
45 0
|
14天前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
34 0
|
14天前
|
存储 关系型数据库 MySQL
MySQL 中的事务存储引擎深入解析
【8月更文挑战第31天】
11 0
|
21天前
|
存储 关系型数据库 MySQL
深入MySQL:事务日志redo log详解与实践
【8月更文挑战第24天】在MySQL的InnoDB存储引擎中,为确保事务的持久性和数据一致性,采用了redo log(重做日志)机制。redo log记录了所有数据修改,在系统崩溃后可通过它恢复未完成的事务。它由内存中的redo log buffer和磁盘上的redo log file组成。事务修改先写入buffer,再异步刷新至磁盘,最后提交事务。若系统崩溃,InnoDB通过redo log重放已提交事务并利用undo log回滚未提交事务,确保数据完整。理解redo log工作流程有助于优化数据库性能和确保数据安全。
81 0
|
21天前
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
85 0