1. 事务基础概念:事务的定义与 ACID 特性详解

1.1 事务的定义

事务(Transaction)是数据库管理系统(DBMS)中执行的一个逻辑工作单元,它由一组不可分割的操作序列组成。事务是并发控制与故障恢复的基本单位,其核心特征是:要么全部成功,要么全部失败。

事务的本质: 将多个读写操作绑定为一个原子执行单元,对外表现为一个不可分割的操作步骤。

一个典型的事务示例——银行转账:

BEGIN TRANSACTION;
  UPDATE accounts SET balance = balance - 500 WHERE account_id = 'A';
  UPDATE accounts SET balance = balance + 500 WHERE account_id = 'B';
COMMIT;

如果任意一条 UPDATE 语句失败,整个事务必须回滚(ROLLBACK),确保账户 A 和账户 B 的余额总和不变。

1.2 ACID 特性总览

ACID 是事务正确执行的四个基本保证,由 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation) 和 持久性(Durability) 组成。下表总结了每个特性的核心含义与实现机制:

特性 英文 核心含义 实现机制
原子性 Atomicity 事务内的操作不可分割,全部成功或全部回滚 Undo 日志、回滚段
一致性 Consistency 事务执行前后,数据库始终满足所有约束 完整性约束、触发器、应用逻辑
隔离性 Isolation 并发事务之间互不干扰,结果与串行执行一致 锁机制、MVCC(多版本并发控制)
持久性 Durability 已提交事务的修改永久保存,不会丢失 Redo 日志、WAL(预写日志)
记忆口诀: ACID 四个特性相互配合——原子性保证操作不可分,一致性保证数据正确,隔离性保证并发安全,持久性保证结果不丢。

1.3 原子性(Atomicity)详解

原子性确保事务中的所有操作被视为一个整体。如果事务执行过程中发生任何故障(系统崩溃、硬件错误、约束违反),已执行的部分操作必须被撤销,恢复到事务开始前的状态。

  • 提交(COMMIT): 事务所有操作成功,永久生效。
  • 回滚(ROLLBACK): 事务中任一操作失败,撤销所有已执行操作。
  • 实现方式: 数据库通过 Undo 日志记录旧值,回滚时根据日志恢复数据。
原子性执行流程 BEGIN 操作 1 操作 2 操作 3 COMMIT ROLLBACK 任一操作失败 → 整体回滚;全部成功 → 提交生效

1.4 一致性(Consistency)详解

一致性保证事务执行前后,数据库始终处于合法状态。所有数据必须满足预定义的完整性约束,包括:

  • 实体完整性: 主键唯一且非空。
  • 参照完整性: 外键引用必须存在。
  • 用户定义完整性: 业务规则(如余额 ≥ 0、年龄 ≥ 18)。
重要区分: 一致性是应用层的语义保证,数据库只能通过约束和触发器辅助实现,最终一致性依赖事务编程的正确性。

一致性示例——账户转账前后总余额不变:

-- 转账前:A=1000, B=500, 总和=1500
UPDATE accounts SET balance = balance - 200 WHERE id = 'A';
UPDATE accounts SET balance = balance + 200 WHERE id = 'B';
-- 转账后:A=800, B=700, 总和=1500(一致)

1.5 隔离性(Isolation)详解

隔离性确保并发执行的事务之间不会互相干扰。SQL 标准定义了四种隔离级别,从低到高依次为:

隔离级别 脏读 不可重复读 幻读 典型实现
READ UNCOMMITTED 可能 可能 可能 无锁
READ COMMITTED 避免 可能 可能 行锁(读已提交)
REPEATABLE READ 避免 避免 可能 行锁 + 间隙锁
SERIALIZABLE 避免 避免 避免 表锁 / 谓词锁
隔离级别与并发问题关系 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 脏读 不可重复读 幻读 隔离性说明 • 隔离级别越高,并发 性能越低 • SERIALIZABLE 完全 避免所有并发问题 • 默认级别通常为 READ COMMITTED

1.6 持久性(Durability)详解

持久性保证一旦事务提交成功,其对数据库的修改就是永久性的,即使系统立即崩溃也不会丢失。实现持久性的核心技术是 预写日志(WAL, Write-Ahead Logging):

  1. 事务修改数据前,先将修改操作记录到 Redo 日志中。
  2. 日志记录写入磁盘后,才将数据页写入磁盘。
  3. 系统崩溃后重启时,通过 Redo 日志重放已提交但未写入磁盘的修改。
WAL 预写日志持久化流程 事务 Redo 日志 磁盘数据 ① 事务修改 → ② 先写 Redo 日志(强制刷盘) → ③ 再写磁盘数据页 崩溃恢复时:扫描 Redo 日志,重放已提交事务的修改

1.7 ACID 特性之间的依赖关系

ACID 四个特性并非独立,而是相互支撑:

  • 原子性 是 一致性 的基础——只有操作不可分割,才能保证数据约束不被破坏。
  • 隔离性 是 一致性 的并发保障——防止并发事务破坏数据完整性。
  • 持久性 是 一致性 的持久保障——已提交的一致状态不会丢失。
核心结论: 一致性是 ACID 的最终目标,原子性、隔离性、持久性都是为达成一致性而提供的技术保证。

1.8 事务状态机

事务在其生命周期中经历以下状态转换:

事务状态机 活动 部分提交 提交 失败 中止 活动 → 部分提交 → 提交(成功路径) 活动 → 失败 → 中止(失败路径)

1.9 本章小结

  • 事务 是数据库操作的最小逻辑单元,具有 ACID 特性。
  • 原子性 通过 Undo 日志实现回滚;一致性 依赖约束与应用逻辑;隔离性 通过锁或 MVCC 实现;持久性 通过 Redo 日志保证。
  • ACID 四个特性中,一致性是最终目标,其他三个特性为一致性提供支撑。
  • 理解 ACID 是学习 ControlTransaction 控制事务与指令序列管理 的基础,后续章节将深入探讨分布式事务、指令序列编排与补偿机制。