16.深入理解数据库事务:从转账场景剖析ACID四大特性与回滚(Rollback)机制

目录

一、事务的基本概念

二、转账场景理解事务(原子性)

转账失败的场景(原子性的必要性)

三、事务的日志与回滚(恢复机制)

日志的作用:

四、事务的使用场景

[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余额 1000id=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...)

我进行的下单操作,势必需要修改两个表:

  1. 订单表新增一个记录

  2. 修改商品表,库存 num数目调整

2. 程序的"失败处理"(try-catch)

工作中,写的程序相当一部分逻辑要考虑**"程序失败"如何处理**:

  • try catch里最多就是打印调用栈。

  • 现阶段写的代码没有真实用户,但不是最开始就能把所有失败都预知,需要产品慢慢打磨。

五、事务的 ACID 特性(背下来)

事务的核心特性是 ACID,分别是:

1. Atomicity(原子性)

  • 多个 SQL 打包成整体,要么全都执行完,要么一个都不执行。

  • ("一个都不执行"是通过回滚机制实现的,不是真没执行,而是回滚到最初状态。)

  • 这是事务的核心机制、初心

2. Consistency(一致性)

  • 一个事务执行前和执行后,数据得是合理的、靠谱的(事务执行不能破坏数据的完整性)。

  • 结合具体场景判定:

    • 普通转账:这边 -500,另一边 +500(最终总和不变)。

    • 借贷:"十出十一归"(场景特殊,需业务逻辑保证合理)。

  • 回滚机制除了保证原子性,也对一致性起作用。

3. Isolation(隔离性)

  • 复杂 & 重要:一个数据库服务器可以同时执行多个客户端提交的事务,且这些事务之间不会产生相互影响

  • 风险:如果多个事务同时读写同一个表,甚至同一个数据,这里就可能出现问题(涉及的问题、解决方案后续介绍)。

4. Durability(持久性)

  • 事务对数据库做出的修改,都是**"持久的"**​ ------ 数据保存在硬盘上,重启服务器、重启数据库都不会使数据丢失。

  • 持久 => 硬盘;不持久 => 内存。

⚠️ 注意:硬盘上的数据也不是"一直持久"的 ------ 如果一个硬盘一直不通电,放几年,上面的数据可能丢失。

总结

事务是数据库的核心机制,通过 ACID 特性​ 保证数据的可靠性:

  • 原子性:打包 SQL,全做或全不做(回滚实现)。

  • 一致性:执行前后数据合理。

  • 隔离性:多事务并发不干扰。

  • 持久性:修改持久化到硬盘。

理解事务,尤其是++原子性、回滚机制、ACID,是数据库开发的基础。++

相关推荐
Yushan Bai2 小时前
ORACLE Enterprise Manager Cloud Control 系列测试2- 日常管理和SQL优化
数据库·oracle
-To be number.wan2 小时前
数据库单表查询全攻略
数据库·学习
文心快码BaiduComate2 小时前
520,Comate Mission模式跨越界限,和你达成最「深」联动
前端·数据库·后端
杨云龙UP2 小时前
Oracle RAC/ODA环境下如何准确查询PDB表空间已分配大小?一次说清Oracle表空间逻辑大小和ASM三副本实际占用_2026-05-19
linux·运维·数据库·sql·oracle·ffmpeg
@nengdoudou2 小时前
KingbaseES数据库MySQL模式使用 “GROUP BY“
数据库·mysql
晨曦中的暮雨2 小时前
3.20字节云部门一面|面经
数据库·oracle
万邦科技Lafite3 小时前
实战演练:利用京东API一键抓取商品详情
数据库·redis·python·缓存·开放api·淘宝开放平台
LIUAWEIO3 小时前
接口 data 满屏反斜杠,怎么展开?
java·开发语言·数据库·json在线解析·data是字符串·json转义·二次json
沪漂阿龙3 小时前
面试题详解:大模型设计沙箱全攻略——LLM Sandbox、Agent 工具执行、代码沙箱、安全隔离、权限控制与工程落地
网络·数据库·人工智能·安全