请使用支持现代 CSS 与 JavaScript 的浏览器播放课件
DBPA · 12.1

并发异常、隔离级别与封锁协议

从并发异常推导隔离与封锁规则

VER. 2608.2 Built with impress.js

学习目标

完成本节后,你应该能够

  1. 01识别并发操作造成的四类异常
  2. 02比较四个事务隔离级别
  3. 03解释 X 锁、S 锁及其相容关系
  4. 04区分一级、二级和三级封锁协议
  5. 05根据一致性需求选择隔离强度或封锁协议
  6. 06说明封锁如何把冲突请求变成等待
2/15
LEARNING OBJECTIVES

并发提高资源利用率,也会交错事务操作

并发提高利用率,但交错调度必须保持事务隔离和正确结果

执行方式运行特点主要风险
串行执行一次只有一个事务资源空闲、吞吐下降
交错并发单处理机轮流推进读写顺序可能覆盖
同时并发多处理机真正并行冲突更难直接观察
3/15
CONCURRENCY

两个售票点各自读到 16,最后可能只扣掉一张票

后一次写入的 15 覆盖先前写入的 15

两个事务都读到余额 16 后交错写回 15 形成丢失修改
Takeaway

串行执行两次应得到 14;交错执行得到 15,后写入覆盖了前一更新

4/15
LOST UPDATE

四类并发异常表现为不同的操作结果

根据操作顺序识别异常,再选择隔离方式

丢失修改

后一次写入覆盖先前写入,导致前一更新丢失:R1→R2→W1→W2

脏读

事务读取另一个事务随后撤销的未提交值:W1→R2→ROLLBACK1

不可重复读

同一事务两次读取同一数据项,结果不同:R1→W2→COMMIT2→R1

幻读

同一事务两次按谓词查询,其他事务插入或删除匹配记录,结果集发生变化

5/15
DATA ANOMALIES

隔离级别:在一致性与并发度间取舍

级别越高,能排除的异常越多,系统代价通常越大

Takeaway

可串行化表示结果等价于某个串行次序;具体调度还要检查冲突操作

6/15
ISOLATION LEVELS

四级隔离对异常的保证逐步增强

四级都能避免丢失修改,但其他保证不同

隔离级别脏读不可重复读幻读典型代价方向
读未提交可能可能可能
读已提交避免可能可能较低
可重复读避免避免可能较高
可串行化避免避免避免
Takeaway

隔离级别描述事务可以观察到的结果;封锁、MVCC 等是不同实现路线,幻读还涉及范围或谓词保护

7/15
ISOLATION MATRIX

封锁把访问冲突变成可管理的等待

事务先申请锁,获准后才能按规则读写

01

申请

事务针对同一数据对象请求 S 锁或 X 锁

02

检查

数据库判断新请求与已有锁是否相容

03

调度

相容则获准读写,不相容则进入等待

04

释放

事务按封锁协议释放锁,等待者才可能继续

Takeaway

不相容请求进入等待,由持锁事务释放锁后再继续;这属于并发控制,不是恢复动作

8/15
LOCKING

S 锁允许并发读,X 锁保护写入

相容性决定第二个事务能否立即继续

S 锁和 X 锁的相容矩阵

S 锁 共享型

持有者可以读,其他事务还能申请 S 锁,但不能申请 X 锁

X 锁 排他型

持有者可以读写,其他事务不能申请任何类型的锁

请求冲突

不相容请求进入等待;例如 T1 持有 S(A) 时,T2 请求 X(A) 不能立即继续

9/15
S AND X LOCKS

三级协议的差别在于申请哪些锁以及何时释放锁

对读—改—写的数据项,先取得 X 锁再读入;所有协议都把 X 锁持有到事务结束

协议写入前与读—改—写读前释放规则
一级加 X 锁不强制加 S 锁X 锁到事务结束
二级加 X 锁加 S 锁S 锁读完释放,X 锁到事务结束
三级加 X 锁加 S 锁S 锁、X 锁都到事务结束
Takeaway

“读前加 X 锁”特指读—改—写场景;所有协议至少要求在写入前取得 X 锁,三级协议还把 S 锁持有到结束

10/15
LOCKING PROTOCOLS

持锁时间决定能阻止哪一种异常

从一级到三级,读取保护越来越强

  1. 01一级:读未提交;X 锁持有到事务结束,防止丢失修改
  2. 02二级:读已提交;读前加 S 锁、读完释放,防止脏读
  3. 03三级:可重复读;S 锁也持有到事务结束,防止不可重复读
Takeaway

在三级协议的抽象中,协议语义对应可串行化;幻读还需要范围或谓词保护

11/15
PROTOCOL GUARANTEES

应按业务风险选择隔离强度

趋势统计和资金扣账对一致性的要求不同

业务情境关注风险隔离目标与实现选择
允许暂时不一致读结果的趋势统计少量暂时误差可从较低隔离、较高并发的方案开始评估
普通订单查询不读未提交数据可从读已提交起步,再按实现选择锁或 MVCC
余额扣账不能重复或覆盖需要更强隔离或显式 X 锁,按业务语义判断
Takeaway

判断顺序是业务风险 → 可接受异常 → 隔离目标 → 锁或其他实现;表中只给出情境示例,具体默认值取决于产品与配置

12/15
CHOOSE THE LEVEL

本节回顾

并发控制从识别异常开始,再把隔离要求落实为锁规则

异常

四类异常包括丢失修改、脏读、不可重复读和幻读

隔离

四个级别逐步加强一致性保证

封锁

S/X 锁决定不相容请求是否等待

协议

申请与释放时机决定协议的保证范围

Takeaway

并发异常 → 隔离目标 → S/X 锁相容性 → 协议申请与释放时机

13/15
RECAP

本节知识地图

14/15
KNOWLEDGE MAP

本节问题

  1. 01给定 R1(A) R2(A) W1(A) W2(A),如何判断它是串行还是交错调度,并说明异常?
  2. 02如何用最小操作线索区分丢失修改、脏读、不可重复读和幻读?
  3. 03给定业务风险,如何选择隔离目标,并说明为什么不能只凭产品名称推断实现?
  4. 04T1 持有 S(A)、T2 请求 X(A) 时是否等待,为什么?
  5. 05一级、二级和三级协议的 S/X 锁申请与释放时机有什么区别?
  6. 06冲突图、死锁和可串行化判断分别解决哪些并发控制问题?
15/15
CHECK YOUR UNDERSTANDING