目录
[1. 电商系统](#1. 电商系统)
[2. 程序的"失败处理"(try-catch)](#2. 程序的“失败处理”(try-catch))
[五、事务的 ACID 特性(背下来)](#五、事务的 ACID 特性(背下来))
[1. Atomicity(原子性)](#1. Atomicity(原子性))
[2. Consistency(一致性)](#2. Consistency(一致性))
[3. Isolation(隔离性)](#3. Isolation(隔离性))
[4. Durability(持久性)](#4. Durability(持久性))
一、事务的基本概念
事务,是把多个 SQL 打包成一个整体:
-
要么全都执行完
-
要么就一个都不执行
-
(不会出现"执行一半"这样的中间状态)
二、转账场景理解事务(原子性)
以 account (userId, balance)表为例(初始数据:id=1余额 1000,id=2余额 1000),执行 1 -> 2 转账 500:
sql
1) update account set balance = balance - 500 where id = 1;
2) update account set balance = balance + 500 where id = 2;
这两个 SQL 是一个原子操作 (不可拆分的最小单位,类比化学中"物质->分子->原子",原子是不可再分的)。数据库的事务,就是用来解决**"原子性"**问题的。
转账失败的场景(原子性的必要性)
之前银行的信息系统没有现在这么发达,可能会存在转账丢失的情况:
-
数据库服务器执行事务时,执行完第一个 SQL(
id=1 扣 500),还没执行第二个 SQL(id=2 加 500)时,突然服务器断电、系统宕机、MySQL 崩溃...... -
专业的机房都有备用供电,但即使如此,极端故障仍可能发生。
三、事务的日志与回滚(恢复机制)
数据库在运行过程中,每次进行增/删/改 操作时,都会记录一个日志(把当前进行的操作保存下来):
-
日志相当于
println,只不过把字符串保存到硬盘文件中。 -
MySQL 自身完成,不需要人工干预。
日志的作用:
-
如果事务正常执行完毕,日志可以删除(不需要了)。
-
如果事务执行一半出现故障 (如断电),日志会记录"已经做了哪些操作"。重启 MySQL 后,读取日志内容,根据已做的操作还原数据 (恢复到最初状态)------ 这就是 回滚(rollback)。
四、事务的使用场景
事务的使用场景非常多,比如:
1. 电商系统
-
商品库存表
(id, num) -
订单表
(orderId, userId, goodId, time...)
我进行的下单操作,势必需要修改两个表:
-
订单表新增一个记录
-
修改商品表,库存
num数目调整
2. 程序的"失败处理"(try-catch)
工作中,写的程序相当一部分逻辑要考虑**"程序失败"如何处理**:
-
try catch里最多就是打印调用栈。 -
现阶段写的代码没有真实用户,但不是最开始就能把所有失败都预知,需要产品慢慢打磨。
五、事务的 ACID 特性(背下来)
事务的核心特性是 ACID,分别是:
1. Atomicity(原子性)
-
多个 SQL 打包成整体,要么全都执行完,要么一个都不执行。
-
("一个都不执行"是通过回滚机制实现的,不是真没执行,而是回滚到最初状态。)
-
这是事务的核心机制、初心。
2. Consistency(一致性)
-
一个事务执行前和执行后,数据得是合理的、靠谱的(事务执行不能破坏数据的完整性)。
-
结合具体场景判定:
-
普通转账:这边
-500,另一边+500(最终总和不变)。 -
借贷:"十出十一归"(场景特殊,需业务逻辑保证合理)。
-
-
回滚机制除了保证原子性,也对一致性起作用。
3. Isolation(隔离性)
-
复杂 & 重要:一个数据库服务器可以同时执行多个客户端提交的事务,且这些事务之间不会产生相互影响。
-
风险:如果多个事务同时读写同一个表,甚至同一个数据,这里就可能出现问题(涉及的问题、解决方案后续介绍)。
4. Durability(持久性)
-
事务对数据库做出的修改,都是**"持久的"** ------ 数据保存在硬盘上,重启服务器、重启数据库都不会使数据丢失。
-
持久 => 硬盘;不持久 => 内存。
⚠️ 注意:硬盘上的数据也不是"一直持久"的 ------ 如果一个硬盘一直不通电,放几年,上面的数据可能丢失。
总结
事务是数据库的核心机制,通过 ACID 特性 保证数据的可靠性:
-
原子性:打包 SQL,全做或全不做(回滚实现)。
-
一致性:执行前后数据合理。
-
隔离性:多事务并发不干扰。
-
持久性:修改持久化到硬盘。
理解事务,尤其是++原子性、回滚机制、ACID,是数据库开发的基础。++