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,是数据库开发的基础。++

相关推荐
睡不醒男孩0308234 小时前
第二篇:深入探索开源数据库高可用:构建基于CLup的PostgreSQL生产级高可用与读写分离架构
数据库·postgresql·开源·clup
Micro麦可乐6 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
码农阿豪6 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
鼎讯信通7 小时前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题
运维·网络·数据库
三十..7 小时前
MySQL 从入门到高可用架构实战精要
运维·数据库·mysql
cfm_29148 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
真实的菜8 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享
数据库·redis·python
你想考研啊9 小时前
mysql数据库导出导入
数据库·mysql·oracle
十年编程老舅9 小时前
Linux DRM:底层逻辑与实践架构
数据库·mysql
The Sheep 202310 小时前
Vue复习
linux·服务器·数据库