第八章 并发控制
8.1 并发控制概述
T1 T2
① 读 A=16
② 读 A=16
③ A← A-1
写回 A=15
④ A← A-1
写回 A=15
一、并发操作可能带来数据的不一致性。
二、并发操作可能带来数
据的不一致性的三种类型。
1、丢失修改
T1 T2
① 读 A=50
读 B=100
求和 =150
② 读 B=100
B←B*2
写回 B=200
③ 读 A=50
读 B=200
求和 =250
(验算不对)
2、不可重复读
T1 T2
① 读 C=100
C←C*2
写回 C
② 读 C=200
③ ROLLBACK
C恢复为 100
3、读“脏”数

8.2 封 锁 (Locking)
一, 封锁的定义
二, 封锁的类型
1,排它锁 (又称为写锁 )
2,共享锁 (又称为读锁 )
T2
T1
X S
X N N Y
S N Y Y
Y Y Y
图 8.2 封锁类型的相容矩阵
8.3 封锁协议
一、一级封锁协议 T1 T2
① Xlock A 获得
②读 A=16
③ A←A -1
写回 A=15
Commit
Unlock A

Xlock A
等待
等待
等待
等待
获得 Xlock A
读 A=15
A←A -1
写回 A=14
Commit
Unlock A
二、二级封锁协议
三、三级封锁协议
8.4 活锁与死锁
一、活锁 T1 T2 T3 T4
Lock R
……
Unlock
……
Lock R
等待
等待
等待
等待
等待
等待
等待
……
Lock R
Lock R
Unlock
……
Lock R
等待
等待
等待
Lock R
二、死锁
T1 T2
Lock R1
……
Lock R2
等待
等待
等待
等待
……
Lock R2
……
Lock R1
等待
等待
1、死锁的预防
(1),一次封锁法
(2),顺序封锁法
2、死锁的诊断与解除
(1),超时法
(2),等待法
T2
T3T1
8.5 并发调度的可串行性
一、定义
多个事务的并发执行是正确的,当且仅当其结果与按
某一次序串行的执行它们时的结果相同,我们称这种调度
策略为 可串行化 (Serializable)的调度,
例如,现有有两个事务,分别包含下列操作,
事务 T1,读 B; A=B+1; 写回 A;
事务 T2,读 A; B=A+1; 写回 B;
假设 A,B的初值均为 2。
按 T1 → T 2的次序执行结果为,A=3,B=4
按 T2 → T 1的次序执行结果为,B=3,A=4
二、两个事务的三种不同的调度策略
T1 T2
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
X=A=3
Unlock A
Xlock B
B=X+1
写回 B(=4)
Unlock B
(a) 串行调度
T1 T2
Slock B
Y=B=3
Unlock B
Xlock A
A=Y+1
写回 A(=4)
Unlock A
Slock A
X=A=2
Unlock A
Xlock B
B=X+1
写回 B(=3)
Unlock B
(b) 串行调度
T1 T2
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
X=A=2
Unlock A
Xlock B
B=X+1
写回 B(=3)
Unlock B
(b) 不可串行化的调度
注意时间
8.6 两段锁协议
一、定义
所谓两段锁协议是指所有事务必须分两个阶段对数据项加锁和
解锁。
★ 在对任何数据进行读、写操作之前,首先要申请并获得对该
数据的封锁;
★ 在释放一个封锁之后,事务不在申请和获得任何其它封锁。
二、举例
事务 T1遵守两段锁协议,其封锁解锁序列为:
Slock A Slock B Xlock C Unlock B Unlock A Unlock C
扩展阶段 收缩阶段
事务 T2不遵守两段锁协议,其封锁解锁序列为:
Slock A Unlock A Slock B Xlock C Unlock C Unlock B
8.7 封锁的粒度
封锁对象的大小称为封锁粒度 (Granularity)。
8.7.1 多粒度封锁
数据库
关系 R1 关系 R2 关系 Rn
元组
……
元组元组 元组 元组 元组元组…… …… ……
图 8.8 三级粒度树
8.7.2 意向锁
一、意向锁的含义
二、三种常用的意向锁
1,IS锁
2,I X锁
3,SI X锁
三、各种锁的相容矩阵
T2
T1 S X IS IX SIX --
S
X
IS
I X
SI X
--
Y
N
Y
N
N
Y
N
N
N
N
N
Y
Y
N
Y
Y
Y
Y
N
N
Y
Y
N
Y
N
N
Y
N
N
Y
Y
Y
Y
Y
Y
Y
8.8 Oracle 的并发控制
一, Oracle 提供的 5种数据锁
共享锁 (S锁 )、排它锁 (X锁 )、行级共享锁 (RS锁 )、行级排它
锁 (RX锁 )和共享行级排它锁 (SRX锁 )。数据锁的相容矩阵如下:
T2 T1 S X RS RX SRX --
S
X
RS
RX
SRX
--
Y
N
Y
N
N
Y
N
N
N
N
N
Y
Y
N
Y
Y
Y
Y
N
N
Y
Y
N
Y
N
N
Y
N
N
Y
Y
Y
Y
Y
Y
Y