事务 ACID

事务的 ACID 是数据库事务正确执行的四个基本特性,用来保证数据在并发和故障场景下的可靠性。下面逐个说明,并补充一些常见考点。


1. A — Atomicity(原子性)

定义:事务是一个不可分割的工作单位,要么全部执行成功,要么全部失败回滚,不存在“做一半”的状态。

关键点

  • 通过 Undo Log(回滚日志) 实现。
  • 如果事务中途失败(如宕机、约束冲突),数据库会利用 Undo Log 将数据恢复到事务开始前的状态。
  • 对用户来说,事务只有两种结果:提交(Commit)回滚(Rollback)

例子
转账操作:A 扣钱、B 加钱必须同时成功;如果 B 加钱失败,A 的扣钱也要撤销。


2. C — Consistency(一致性)

定义:事务执行前后,数据库都必须从一个一致状态变到另一个一致状态,不破坏业务规则和约束。

关键点

  • 一致性是 目标,原子性、隔离性、持久性是 手段
  • 依赖:主键、外键、唯一约束、Check 约束,以及应用层的业务规则。
  • 即使系统崩溃,数据库也不会出现“逻辑错误”。

例子
账户总额在转账前后应保持不变;库存不能为负数(在有约束的情况下)。


3. I — Isolation(隔离性)

定义:多个事务并发执行时,一个事务的操作不应被其他事务干扰,各事务之间要相互隔离。

关键点

  • 通过 锁机制 + MVCC(多版本并发控制) 实现。
  • SQL 标准定义了四种隔离级别(从低到高):
    1. Read Uncommitted(读未提交):可能脏读。
    2. Read Committed(读已提交):避免脏读,可能不可重复读。
    3. Repeatable Read(可重复读):避免脏读、不可重复读,InnoDB 还能防幻读。
    4. Serializable(串行化):完全隔离,性能最低。
  • MySQL InnoDB 默认是 Repeatable Read,并通过 Next-Key Lock 解决幻读问题。

例子
事务 A 读取某行数据时,事务 B 正在修改这行,隔离性保证 A 不会看到中间不一致的状态。


4. D — Durability(持久性)

定义:一旦事务提交,其结果就是永久性的,即使系统崩溃也不会丢失。

关键点

  • 通过 Redo Log(重做日志) 实现。
  • 事务提交时,先将修改写入 Redo Log(顺序写,快),再异步刷盘。
  • 宕机重启后,数据库通过 Redo Log 恢复已提交但未落盘的数据。

例子
转账成功后即使数据库立刻断电,重启后这笔转账记录依然存在。


四者关系总结

特性 作用 实现手段
Atomicity(原子性) 要么全做,要么全不做 Undo Log
Consistency(一致性) 数据逻辑始终正确 AID + 约束 + 业务规则
Isolation(隔离性) 并发事务互不干扰 锁 + MVCC
Durability(持久性) 提交后永不丢失 Redo Log

一句话概括:
原子性、隔离性、持久性共同保障一致性。


常见面试/考试延伸点

  • Undo Log vs Redo Log:Undo 用于回滚和 MVCC 读旧版本,Redo 用于崩溃恢复。
  • WAL(Write-Ahead Logging):先写日志,再改数据页,是 ACID 实现的核心思想。
  • MySQL InnoDB 的 RR 为什么能防幻读?:Next-Key Lock(记录锁 + 间隙锁)。
  • CAP 与 ACID 的区别:CAP 针对分布式系统(一致性、可用性、分区容忍性),ACID 针对数据库事务。
上一篇
下一篇