ZaynPei Lv6

ACID

ACID 是数据库系统中用于描述事务特性的四个关键属性的首字母缩写,分别代表原子性Atomicity)、一致性Consistency)、隔离性Isolation)和持久性Durability)。这些属性确保了数据库在处理事务时能够保持数据的完整性和可靠性。

日志

这里的日志指的是预写式日志(Write-Ahead Logging, WAL), 它是实现 ACID 特性的重要机制之一。

数据库系统通常使用日志(Log)来记录事务的操作,以便在系统崩溃或故障时能够恢复数据。

日志记录了事务的开始修改的数据以及事务的提交回滚信息

通过日志,数据库可以在发生故障后重新执行已提交的事务,确保数据的一致性和持久性。

核心思想:先写日志,再写真实数据

WAL 的核心思想是:在对实际数据进行任何修改之前,必须先将这个“修改意图”记录到一个单独的、仅追加(Append-only)的日志文件中,并确保这个日志已经安全地落盘(持久化)。

假如系统在运行中断电, 当系统从断电中重启时,恢复程序会执行以下操作:

  • 读取日志: 系统会检查日志文件。
  • 分析日志: 它会查看哪些操作(事务)在日志中被标记为“已提交(Committed)”(即转账的两个步骤都已记录在日志中),哪些操作是“未提交”的(比如只记录了A-100,没有后续B+100的记录)。
  • 执行“重做”(REDO)和“撤销”(UNDO):
    • 对于“已提交”的事务: 恢复程序会重新执行日志中记录的所有操作(例如,A-100, B+100)。这保证了操作的持久性。 即使数据文件在断电时只写了一半,日志里有完整的记录,所以可以重做一遍来保证数据是完整的。这个重做操作被设计为幂等(Idempotent)的(即做一遍和做五遍的结果相同)。
    • 对于“未提交”的事务: 恢复程序会撤销该事务已经执行的所有操作(例如,把A-100的操作给“滚”回去,让A的余额+100)。这保证了操作的原子性。

通过“先写日志”这个规则,系统把一个“非原子的多步操作(修改真实数据)”转换成了一个“原子的单步操作(往日志末尾追加一条记录并落盘)”。只要日志写入成功(提交),系统就承诺这个操作“一定”会发生,即使中途断电,重启后也能通过日志来恢复。