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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 上来就问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文章专门来介绍这块。



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
4月前
|
存储 监控 Oracle
MySQL事务
MySQL事务具有ACID特性,包括原子性、一致性、隔离性和持久性。其默认隔离级别为可重复读,通过MVCC和间隙锁解决幻读问题,确保事务间数据的一致性和并发性。
MySQL事务
|
5月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
2月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
271 0
|
3月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
168 0
|
5月前
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
185 1
|
12月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
4941 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
11月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
582 7
MySQL事务日志-Undo Log工作原理分析
|
12月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
关系型数据库 MySQL 数据库
MySQL事务隔离级别及默认隔离级别的设置
在数据库系统中,事务隔离级别是一个关键的概念,它决定了事务在并发执行时如何相互隔离。MySQL提供了四种事务隔离级别,每种级别都解决了不同的并发问题。本文将详细介绍这些隔离级别以及MySQL的默认隔离级别。

推荐镜像

更多