根据教材内容,事务(Transaction)是指数据库查询和/或修改的过程 [1, transactions.pdf]。事务通常在并发执行时具有一些强大的属性,以确保数据的一致性和可靠性 [1, transactions.pdf]。

ACID

ACID 是数据库事务的四个基本属性,用于确保数据库操作的可靠性和完整性,它们是:

  • 原子性 (Atomicity):指事务是一个不可分割的整体,事务中的所有操作要么全部完成,要么全部不完成。如果在事务执行过程中发生故障,已经进行的操作将被撤销,数据库恢复到事务开始前的状态 [5]。
  • 一致性 (Consistency):指事务执行前后,数据库从一个一致性状态转换到另一个一致性状态。这意味着事务不会破坏数据库的完整性约束(如键约束、外键约束、检查约束等) [5]。
  • 隔离性 (Isolation):指并发执行的事务之间互不干扰。每个事务都感觉自己是系统中唯一运行的事务,其操作对其他并发事务是不可见的,直到该事务提交 [5]。
  • 持久性 (Durability):指一旦事务成功提交,其对数据库所做的修改将是永久性的,即使发生系统崩溃(如断电)也不会丢失 [5]。
指向原始笔记的链接

事务日志

事务日志,在 openGauss 数据库中也被称为预写式日志(WAL, Write Ahead Log)或 Xlog ,是保护数据安全的重要手段之一 。

事务日志的工作原理主要是为了保证数据的持久性和支持崩溃恢复 。其核心原则是:如果要修改数据文件,必须是在这些修改操作已经记录到日志文件并刷新到永久存储器(如磁盘)之后才能进行修改 。

事务日志在崩溃恢复中的工作原理可以概括为以下几点 :

  1. 记录写操作: 数据库系统会将所有写入操作(数据修改)记录到事务日志中,日志记录在稳定存储介质上 。
  2. 检查点 (Checkpoint): 定期将已提交事务的数据修改从内存缓冲区写入到数据库文件在磁盘上的对应位置 。同时,也会在日志中记录检查点信息,标识一个数据在磁盘上已知一致的状态点。
  3. 崩溃发生: 如果系统在事务提交或写入数据到磁盘的过程中崩溃。
  4. 恢复过程: 当系统重启后,数据库管理系统会读取日志文件,并执行恢复操作 。这个过程通常包括分析(Analyze)、撤销(Undo)和重做(Redo)几个阶段 。通过检查点和日志记录,系统可以确定崩溃前哪些事务已经提交但可能未完全写入磁盘(需要重做),哪些事务未提交(需要撤销),从而将数据库恢复到崩溃前的一个一致状态。

例如,教材中提到一个银行转账的例子,从 A 账户转 100 美元到 B 账户:A = A - $100 接着是 B = B + $100 。如果系统在执行完 A = A - $100 后崩溃,B = B + $100 未执行,日志会记录 A 账户的修改 。恢复时,系统会检测到该事务未完全完成(未执行 B = B + $100 或未提交),从而撤销对 A 账户的修改,保证事务的原子性。另一个例子是如果 A = A - $100B = B + $100 都执行了,但在提交或将修改写入磁盘前崩溃,恢复系统会看到日志中记录了这两个操作已完成,并在恢复时重做这些操作,确保已完成事务的持久性 。

总结来说,事务日志记录了数据库的所有变更,是实现事务 ACID 特性中持久性(Durability)和支持崩溃恢复的关键机制。

指向原始笔记的链接