文章目录
- 前言
- 什么是事务?
- 事务的特性
- 并发情况下会出现哪些问题
- 脏读
- 不可重复读
- 幻读
- 总结
前言
今天来讲一讲 MySQL 事务的基础入门。
更多关于MySQL的知识可以看此专栏 MySQL专栏(持续更新)
什么是事务?
当我们在操作数据库的时候,有时候是一条SQL语句,有时候需要多条SQL语句,当一个业务功能需要多条SQL语句执行时,这就涉及到事务的观念了。
事务:多条SQL语句要么全部执行成功,要么全部执行失败。
我们来看一个经典的转账的案例,同学A余额有100万,同学B余额有50万。此时同学 A 想转账 50 万给同学 B。具体操作如下:
- 同学A的余额减去50万
- 同学B的余额加50万
以上涉及三条SQL语句吧。如果没有事务的情况下,当执行完 1(同学A的余额减去50万) 的步骤时,网络掉了,客户端连接不上MySQL了,需要重启MySQL。那么这时候同学 A已经减去了 50万,同学 B 却还没加 50 万,50 万消失了。这同学 A 血亏。
而如果有事务的情况下,当执行完 1(同学A的余额减去50万) 然后断开服务时,我们的事务会回滚,也就是转账失败,都没有执行成功,同学 A 没有减去 50 万。同学 B 的余额也没加 50 万。
事务的特性
A,Atomicity,原子性:一个事务中的所有操作,要么全部执行成功,要么全部执行失败。不会只执行到中间。例如上述的转账的具体操作:1. 同学A的余额减去50万 2. 同学B的余额加50万。要么全部执行,要么全部不执行。不会只执行一句。
C,Consistency,一致性:指无论是操作前,还是操作后,数据都是保持一致性的状态。数据满足完整性的约束。比如上述中的案例,不会出现 50 万消失了的状态。
I,Isolation,隔离性:指各个不同的事务在执行的过程中互不影响,互不约束。数据库允许多个并发事务同时对其数据进行读写和修改的能力。
D,Durability,持久性:事务处理结束后,修改的数据是永久的,即使系统故障也不会改变。
MySQL 中 Innndb 是支持事务的,之前的存储引擎 MyLSAM 是不支持事务的。
不了解存储引擎的可以看这篇 MySQL 的存储引擎
InnoDB 引擎是通过什么技术保持事务的特性呢?
- 持久性:通过 redo log
- 原子性:通过 undo log
- 隔离性:通过 MVCC 机制或锁机制
持久性 + 原子性 + 隔离性 的目的是为了实现一致性。
并发情况下会出现哪些问题
脏读
脏读:读到未提交事务的数据。
如下,初始条件:最初的余额为 100 万。
同学 B 两次读到的数据不同,第一次读到的 50 万是同学A未提交的事务。这是不正确的数据,读到未提交事务的数据就是脏读。
不可重复读
不可重复读:在同一个查询中,两次读取的事务不一致,就是“不可重复读”。
这相比于脏读,是读到了已提交的事务的数据。还是以上述为例进行修改。
同学B两次读取的数据不一致,是因为同学A在期间修改过一次数据。读到不同事务修改后的数据,导致两次读取不一致,这种现象就是“不可重复读”。
幻读
幻读:本来数据 12 条,再次读取变成 20 条。两次读取的数量不一致,这种现象就是 “幻读”。
举例如图
同学B两次读取的数据的数量不同,是因为同学A开启事务进行插入新数据。这种现象就是幻读。
总结
总的来说,事务就是要么执行成功,要么执行失败。事务的特性是 ACID,AID 的特性是为了保持 C 一致性。
事务在并发过程中出现的情况有:脏读、不可重复读、幻读。
有启发点个赞 🌹
好文章不要错过,最近給大家分享的文章
MySQL的基础知识
1.MySQL的基础架构
2.SQL语句的执行流程
3.MySQL 的存储引擎
MySQL 索引
1.MySQL索引入门(一文搞定)
预计下篇分享:MySQL 的事务的隔离级别
本篇参考:小林coding
我是小辉,正在进行 Java 实习的 24 届应届毕业生。欢迎关注,持续分享,包括但不限于技术文章。全网同名…