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 日志记录旧值,回滚时根据日志恢复数据。
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 | 避免 | 避免 | 避免 | 表锁 / 谓词锁 |
1.6 持久性(Durability)详解
持久性保证一旦事务提交成功,其对数据库的修改就是永久性的,即使系统立即崩溃也不会丢失。实现持久性的核心技术是 预写日志(WAL, Write-Ahead Logging):
- 事务修改数据前,先将修改操作记录到 Redo 日志中。
- 日志记录写入磁盘后,才将数据页写入磁盘。
- 系统崩溃后重启时,通过 Redo 日志重放已提交但未写入磁盘的修改。
1.7 ACID 特性之间的依赖关系
ACID 四个特性并非独立,而是相互支撑:
- 原子性 是 一致性 的基础——只有操作不可分割,才能保证数据约束不被破坏。
- 隔离性 是 一致性 的并发保障——防止并发事务破坏数据完整性。
- 持久性 是 一致性 的持久保障——已提交的一致状态不会丢失。
核心结论: 一致性是 ACID 的最终目标,原子性、隔离性、持久性都是为达成一致性而提供的技术保证。
1.8 事务状态机
事务在其生命周期中经历以下状态转换:
1.9 本章小结
- 事务 是数据库操作的最小逻辑单元,具有 ACID 特性。
- 原子性 通过 Undo 日志实现回滚;一致性 依赖约束与应用逻辑;隔离性 通过锁或 MVCC 实现;持久性 通过 Redo 日志保证。
- ACID 四个特性中,一致性是最终目标,其他三个特性为一致性提供支撑。
- 理解 ACID 是学习 ControlTransaction 控制事务与指令序列管理 的基础,后续章节将深入探讨分布式事务、指令序列编排与补偿机制。