3.8.2 事务的特性
本课核心知识点整理
事务是数据库执行的逻辑单位
事务是一组数据库操作构成的逻辑工作单位。它可以包含多条读写操作,但从业务角度看应当作为一个整体成功或失败。转账是最典型的例子:甲账户减 100 和乙账户加 100 必须一起成立。
事务通常经历:
mermaid
stateDiagram-v2
[*] --> Begin
Begin --> Active: 执行读写
Active --> Commit: 全部成功
Active --> Rollback: 出错或主动撤销
Commit --> [*]: 修改持久生效
Rollback --> [*]: 撤销已做修改ACID 四特性
| 字母 | 特性 | 关键词 | 转账例子 |
|---|---|---|---|
| A | 原子性 Atomicity | 要么全做,要么全不做 | 扣款成功但入账失败时,扣款也要撤销 |
| C | 一致性 Consistency | 从一个一致状态到另一个一致状态 | 总金额守恒,约束不被破坏 |
| I | 隔离性 Isolation | 并发事务互不可见 | 张三转账不应读到李四事务的中间状态 |
| D | 持久性 Durability | 提交后永久有效 | COMMIT 后即使故障,结果也不丢 |
这四个特性不是孤立的。原子性和持久性依赖日志与恢复机制,隔离性依赖并发控制,一致性则是业务约束和数据库机制共同保证的目标。
原子性:失败就回滚
原子性强调事务内部操作不可只完成一半。若转账事务执行到“甲账户扣款”后失败,而乙账户没有入账,数据库必须通过 ROLLBACK 把扣款撤销,让事务像从未发生过一样。
| 状态 | 含义 |
|---|---|
BEGIN | 事务开始 |
COMMIT | 成功提交,全部修改生效 |
ROLLBACK | 回滚,撤销已做修改 |
题干出现“全部成功或全部失败”“要么提交要么回滚”,基本对应原子性。
持久性:提交后故障也不能丢
持久性强调事务一旦 COMMIT,即使数据库随后崩溃,更新结果也应永久有效。字幕里讲到数据库通常依赖日志:先写日志,再写数据。系统恢复时扫描日志,把已有 COMMIT 标记的事务加入 redo 队列,从 BEGIN 到 COMMIT 的操作重新做一遍,保证提交结果不丢失。
| 机制 | 对应作用 |
|---|---|
| 日志 | 记录事务修改轨迹 |
REDO | 重做已提交事务,保证持久性 |
UNDO/ROLLBACK | 撤销未完成事务,保证原子性 |
题干说“提交后更新还在缓冲区,故障后不会丢失”,答案是持久性,不是原子性。
一致性与隔离性
一致性强调事务执行前后数据库满足约束。例如转账前后账户总额不应凭空变化,外键约束、余额非负等业务规则不应被破坏。
隔离性强调并发事务互不干扰。一个事务在完成前,对其他事务的中间修改不应随意可见。并发执行时最容易破坏的就是隔离性,因此需要封锁协议等机制。
做题路线
- “全做/全不做、回滚”对应原子性。
- “一致状态到一致状态、满足约束”对应一致性。
- “并发互不影响、事务间不可见”对应隔离性。
- “提交后不丢失、故障后仍有效、redo”对应持久性。
例题
事务中操作要么全部完成,要么全部不做,体现:
事务提交后,其结果应永久保存在数据库中,体现:
自查要点
- ACID 四个字母分别代表什么?
- 原子性和持久性如何区分?
- 隔离性和并发控制有什么关系?