上来就问MySQL事务,瑟瑟发抖...(1)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 上来就问MySQL事务,瑟瑟发抖...

MySQL事务

系列文章

一、什么是事务

二、事务四大特征

1. 原子性

2. 一致性

3. 隔离性

4. 持久性

三、事务并发会出现的问题

1. 脏读

2. 不可重复读

3. 幻读

4. 区别

四、事务日志以及事务异常如何应对

1. 重做日志(redo log)(持久性实现原理)

2. 服务器异常停止对事务如何应对(事务写入过程)

3. 回滚日志(undo log)(原子性实现原理)

五、锁机制

1. 行锁

2. 表锁

3. 如何加锁

六、总结

————————————————

关于学习这件事情宁可花点时间系统学习,也不要东一榔头西一棒槌,都说学习最好的方式就是系统的学习,希望看完本文会让你对事务有一定的理解。数据库版本为8.0


系列文章

1. 揭开MySQL索引神秘面纱

2. MySQL查询优化必备

3. 上来就问MySQL事务,瑟瑟发抖...




一、什么是事务

事务是独立的工作单元,在这个独立工作单元中所有操作要么全部成功,要么全部失败。


也就是说如果有任何一条语句因为崩溃或者其它原因导致执行失败,那么未执行的语句都不会再执行,已经执行的语句会进行回滚操作,这个过程被称之为事务。


例:


最近在写一个论坛系统,当发布的主题被其它用户举报后,后台会对举报内容进行审核。


一经审核为违规主题,则进行删除主题的操作,但不仅仅要删除主题还要删除主题下的帖子、浏览量,关于这个主题的一切信息都需要进行清理。


删除流程如下,用上边概念来说,以下执行的四个流程,每个流程都必须成功否则事务回滚返回删除失败。


假设执行到了第三步后SQL执行失败了,那么第一二步都会进行回滚,第四步则不会在执行。


image.png


二、事务四大特征

事务的四大特征,原子性、一致性、隔离性、持久性。


1. 原子性

事务中所有操作要么全部成功,要么全部失败,不会存在一部分成功,一部分失败。


这个概念也是事务最核心的特性,事务概念本身就是使用原子性进行定义的。


原子性的实现是基于回滚日志实现(undo log),当事务需要回滚时就会调用回滚日志进行SQL语句回滚操作,实现数据还原。


2. 一致性

一致性,字面意思就是前后一致呗!在数据库中不管进行任何操作,都是从一个一致性转移到另一个一致性。


当事务结束后,数据库的完整性约束不被破坏。


当你了解完事务的四大特征之后就会发现,都是保证数据一致性为最终目标存在的。


在学习事务的过程中大家看到最多的案例就是转账,假设用户A与用户B余额共计1000,那么不管怎么转俩人的余额自始至终也就只有1000。


3. 隔离性

保证事务执行尽可能的不受其它事务影响,这个是隔离级别可以自行设置,在innodb中默认的隔离级别为可重复读(Repeatable Read)。


这种隔离级别有可能造成的问题就是出现幻读,但是使用间隙锁可以解决幻读问题。


学习了隔离性你需要知道原子性和持久性是针对单个事务,而隔离性是针对事务与事务之间的关系。


4. 持久性

持久性是指当事务提交之后,数据的状态就是永久的,不会因为系统崩溃而丢失。


事务持久性是基于重做日志(redo log)实现的。


三、事务并发会出现的问题

1. 脏读

读取了另一个事务没有提交的数据。

屏幕快照 2022-05-20 下午2.07.00.png


以上表为例,事务A读取主题访问量时读取到了事务B没有提交的数据150。


如果事务B失败进行回滚,那么修改后的值还是会回到100。


然而事务A获取的数据是修改后的数据,这就有问题了。


2. 不可重复读

事务读取同一个数据,返回结果先后不一致问题。

屏幕快照 2022-05-20 下午2.07.41.png


上表格中,事务A在先后获取主题访问量时,返回的数据不一致。


也就是说在事务A执行的过程中,访问量被其它事务修改,那么事务A查询到的结果就是不可靠的。


**脏读与不可重复读的区别**


脏读读取的是另一个事务没有提交的数据,而不可重复读读取的是另一个事务已经提交的数据。


3. 幻读

事务按照范围查询,俩次返回结果不同。

屏幕快照 2022-05-20 下午2.07.59.png



以上表为例,当对100-200访问量的主题做统计时,第一次找到了100个,第二次找到了101个。


4. 区别

脏读读取的是另一个事务没有提交的数据,而不可重复读读取的是另一个事务已经提交的数据。

幻读和不可重复读都是读取了另一条已经提交的事务(这点与脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

针对以上的三个问题,产生了四种隔离级别。


在第二节中对隔离性进行了简单的概念解释,实际上的隔离性是很复杂的。


在MySQL中定义了四种隔离级别,分别为未提交读 (Read Uncommitted)、提交读 (Read committed)、可重复读取 (Repeatable Read)、可串行化 (Serializable)。


未提交读 (Read Uncommitted):俩个事务同时运行,有一个事务修改了数据,但未提交,另一个事务是可以读取到没有提交的数据。这种情况被称之为脏读。

提交读(Read committed):一个事务在未提交之前,所做的任何操作其它事务不可见。这种隔离级别也被称之为不可重复读。因为会存在俩次同样的查询,返回的数据可能会得到不一样的结果。

可重复读(Repeatable Read):这种隔离级别解决了脏读问题,但是还是存在幻读问题,这种隔离界别在MySQL的innodb引擎中是默认级别。MySQL在解决幻读问题使用间隙锁来解决幻读问题。

可串行化 (Serializable):这种级别是最高的,强制事务进行串行执行,解决了可重复读的幻读问题。

屏幕快照 2022-05-20 下午2.08.10.png



对于隔离级别,级别越高并发就越低,而级别越低会引发脏读、不可重复读、幻读的问题。


因此在MySQL中使用可重复读(Repeatable Read)作为默认级别。


作为默认级别是如何解决并处理相应问题的呢!


那么针对这一问题,是一个难啃的骨头,咔咔将在下一期MVCC文章专门来介绍这块。



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
103 43
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1650 14
|
3月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
566 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
2月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
3月前
|
SQL 关系型数据库 MySQL
MySQL基础:事务
本文详细介绍了数据库事务的概念及操作,包括事务的定义、开启、提交与回滚。事务作为一组不可分割的操作集合,确保了数据的一致性和完整性。文章还探讨了事务的四大特性(原子性、一致性、隔离性、持久性),并分析了并发事务可能引发的问题及其解决方案,如脏读、不可重复读和幻读。最后,详细讲解了不同事务隔离级别的特点和应用场景。
150 4
MySQL基础:事务
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL】索引和事务
【MySQL】索引和事务
55 0
|
3月前
|
SQL Oracle 关系型数据库
详解 MySQL 的事务以及隔离级别
详解 MySQL 的事务以及隔离级别
44 0
|
4月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
172 0
|
4月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
115 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中的事务存储引擎深入解析
【8月更文挑战第31天】
57 0