Appearance
考点清单
- [x] 事务 ACID 特性
- [x] 并发控制问题(丢失更新/不可重复读/读脏数据)
- [x] 封锁协议(X锁/S锁/三级封锁协议)
笔记
一、事务 ACID 特性
事务:由一系列操作组成,这些操作要么全做,要么全不做。
| 特性 | 含义 | 记忆口诀 |
|---|---|---|
| 原子性(Atomicity) | 要么全做,要么全不做 | 操作层面 |
| 一致性(Consistency) | 事务发生后数据是一致的(如转账,A扣钱B必到账) | 数据层面 |
| 隔离性(Isolation) | 任一事务的更新操作直到其成功提交的整个过程对其他事务都是不可见的 | 执行层面 |
| 持久性(Durability) | 事务操作的结果是持续性的 | 改变层面 |
二、并发控制问题
事务是并发控制的前提条件,并发控制就是控制不同的事务并发执行,提高系统效率。但并发控制中存在以下三个问题:
| 问题 | 描述 | 场景示例 |
|---|---|---|
| 丢失更新 | 事务1对数据A修改写回,事务2也对A修改写回,事务2覆盖事务1的更新 | 两个事务同时修改同一数据 |
| 不可重复读 | 事务2读A,事务1修改A并写回,事务2再次读A发现数据不对 | 同一个事务两次读取结果不同 |
| 读脏数据 | 事务1修改A,事务2读取A,事务1回滚,事务2读到的是无效数据 | 读取了未提交的修改 |

三、封锁协议
锁类型:
- X 锁(排他锁 / 写锁):若事务 T 对数据对象 A 加上 X 锁,则只允许 T 读取和修改 A,其他事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁。
- S 锁(共享锁 / 读锁):若事务 T 对数据对象 A 加上 S 锁,则只允许 T 读取 A(不能修改),其他事务只能再对 A 加 S 锁(能读不能修改),直到 T 释放 A 上的 S 锁。
三级封锁协议:
| 级别 | 规则 | 可解决问题 |
|---|---|---|
| 一级封锁协议 | 事务在修改数据 R 之前必须先对其加 X 锁,直到事务结束才释放 | 丢失更新 |
| 二级封锁协议 | 一级 + 事务在读数据 R 之前必须先对其加 S 锁,读完后即可释放 S 锁 | 丢失更新、读脏数据 |
| 三级封锁协议 | 一级 + 事务在读取数据 R 之前先对其加 S 锁,直到事务结束才释放 | 丢失更新、读脏数据、不可重复读 |
记忆要点:三级封锁协议的核心区别在于 S 锁的释放时机。二级是读完即释放,三级是事务结束才释放。级别越高,并发度越低。
