并发控制
并发控制就是要通过正确的调度方式, 使一个用户事务的执行不受其它事务的 干扰,从而避免造成数据的不一致性。
403教研室 韦素媛
107.Βιβλιοθήκη .2 锁定义 锁是防止存取同一资源的用户之间出现不正确地
修改数据或不正确地更改数据结构的一种机制。 基本的锁方式有二种: 排它锁(Exclusive Locks ,简记为X锁) 共享锁(Share Locks ,简记为S锁)
地全部加锁,否则就不能继续执行。 缺点:扩大了锁的范围,降低了系统的并发度。
403教研室 韦素媛
24
(3)死锁的预防(OS)
②顺序加锁法 预先对数据项规定一个加锁顺序,所有事务都按
这个顺序进行加锁。 缺点:很难按规定的顺序进行加锁。
403教研室 韦素媛
25
(4)死锁的检测与解除
1)超时法 如果一个事务的等待时间超过了规定的时限,就
T1
Read(A) A:=A-100 Write(A) Read(B) B:=B+100 Write(B)
T2
Read(B) Temp:=B*0.2 B:=B-temp Write(B) Read(C) C:=C+temp Write(C)
(b)
33
正确的.vs.错误的并发调度
T1
Read(A) A:=A-100 Write(A)
设甲售票点对应于事务T1,乙售票点对应于事务T2,则上 述事务过程的描述如图
403教研室 韦素媛
5
(1)丢失修改
时间
T1
t0
t1
read(A)
t2
t3
A:=A-1
t4
write(A)
t5
t6
t7
t8
403教研室 韦素媛
T2
DB中的A值
25
read(A)
丢失修改 24
A:=A-1 write(A)
24
可串行性(Serializability)是并发事务正确性的 判别准则。按照这个准则的规定,一个给定的 并发调度,当且仅当它可串行化时,才认为是 正确的调度。
403教研室 韦素媛
31
7.5.5 并发调度的可串行性
示例 事务T1:从账号A将数量为100的款项转到账号B; 事务T2:从账号B将20%的款项转到账号C。 假设A、B和C的初值分别为600、300和100。
403教研室 韦素媛
15
(1)一级锁协议
事务T在修改数据R之前必须先对数据R所在的项 申请加X锁,在获得了X加锁后,直到该事务T结 束时才释放所加的X锁。
如果未获准加X锁,则该事务T进入等待状态,直 到获准X加锁后该事务才继续执行。
403教研室 韦素媛
16
(1)一级锁协议
事务T要修 改数据R:
申请加X锁? N
Read(B) B:=B+100 Write(B)
T2
Read(B) Temp:=B*0.2 B:=B-temp Write(B)
Read(C) C:=C+temp Write(C)
T1
Read(A) A:=A-100
Write(A) Read(B)
B:=B+100 Write(B)
T2
Read(B) Temp:=B*0.2 B:=B-temp
当某个事务T希望阻止其它事务修改正为它读取的 某个数据项A时,则该事务可以对A加共享锁, 共享锁又称为读锁。
本事务:读A,不能修改A 其它事务:加S锁读A,在T释放A上S锁之前不能
修改A
403教研室 韦素媛
13
S锁和X锁的共存相容矩阵
S
X
-
S
×
X
×
×
403教研室 韦素媛
14
7.5.3 锁协议
如果未获准加S锁,则该事务T进入等待状态,直 到获准S加锁后该事务才继续执行。
403教研室 韦素媛
18
(2)二级锁协议
一级锁协议+
事务T要读 数据R:
申请加S锁?
Y 加S锁 读数据
释放S锁
N
等待
本事务:读R,不能修改R ;用UNLOCK 释放S锁(不需
等T结束)
其它事务:可加S锁读R,不能修改R
作用:防止丢失修改,防止读“脏”数据
20
(3)三级锁协议
一级锁协议+
事务T要读 数据R:
申请加S锁?
N 等待
Y 加S锁 读数据
T结束 释放S锁
本事务:读R,不能修改R;用COMMIT和ROLLBACK 释放其它事务:可加S锁读R,不能修改R
作用:防止丢失修改,防止读“脏”数据,防止读过时 数据
403教研室 韦素媛
21
7.5.4 封锁带来的问题(1)活锁
36
7.5.6 两段锁协议
②两段锁协议和可串行化调度 若并发执行的所有事务均遵守两段锁协议,则对
这些事务的任何并发调度策略都是可串行化的 (充分条件,不是必要条件) ③两段锁协议和一次加锁法 一次加锁法遵守两段锁协议; 遵守两段锁协议的事务并不遵守一次加锁法。
403教研室 韦素媛
37
6
(2)读过时数据
时间 t0 t1 t2 t3 t4 t5
T1
read(A)
A:=A-10 write(A)
403教研室 韦素媛
T2
DB中的A值
25
read(A)
读过时数据
15
7
(3)读“脏”数据
时间 t0 t1 t2 t3 t4 t5 t6
T1
read(A) A:=A-10 write(A)
ROLLBACK
403教研室 韦素媛
T2
DB中的A值
25
读re“ad脏(A)”数据 15
25
8
DB并发操作带来的三类数据不一致问题
并发操作可能带来的数据不一致性情况有三种 (1)丢失修改 (2)读过时数据 (3)读“脏”数据
403教研室 韦素媛
9
DB并发操作带来的三类数据不一致问题
产生原因: 并发操作破坏了事务的隔离性
如果事务T1封锁了数据R,事务T2又请求封锁R, 于是T2等待,T3也请求封锁R,当T1释放了R 上的封锁之后,系统首先批准了T3的请求,T2 仍然等待,然后T4又请求封锁R,当T3释放了R 上的封锁之后,系统又批准了T4的请求,T2继 续等待,……,如此下去,T2有可能永远等待。
这种可能存在某个事务永远处于等待状态、得不 到封锁的机会的现象,称为活锁。
403教研室 韦素媛
32
正确的并发调度
T1
Read(A) A:=A-100 Write(A) Read(B) B:=B+100 Write(B)
T2
Read(B) Temp:=B*0.2 B:=B-temp Write(B) Read(C) C:=C+temp Write(C)
(a)
403教研室 韦素媛
解决方法:先来者先执行。
403教研室 韦素媛
22
(2)死锁
两个或两个以上的事务都处于等待状态,每个事 务都在等待其中另一个事务解除封锁,它才能 继续执行下去,结果任何一个事务都无法继续 执行,这种现象称为死锁。
① R1 ④
T1
T2
③ R2 ②
403教研室 韦素媛
23
(3)死锁的预防(OS)
①一次加锁法 要求每个事务必须对所有要使用的数据项一次性
若T1正在等待给被T2锁住的数据项加锁,则在 T1和T2之间划一条有向边,方向是T1指向T2。 事务的有向等待图动态地反映了所有事务的等 待情况。
403教研室 韦素媛
27
(4)死锁的检测与解除
有向等待图中的每个回路意味着死锁的存在; 如果无任何回路,则表示无死锁产生。
并发控制子系统周期性地(比如每隔0.5分钟) 检测事务的有向等待图,如果发现有向等待图 中存在回路,就表示系统中出现了死锁。
认为发生了死锁。 优点:实现简单 缺点: 有可能误判死锁 若时限设置的太长,可能出现死锁发生后不能
及时发现的情况。
403教研室 韦素媛
26
(4)死锁的检测与解除
2)有向等待图法
①检测死锁
画一个表示事务等待关系的有向等待图G=(V, E)。V为结点集合,结点表示一个正在运行的事 务;E为有向边集合,有向边表示事务的等待关 系。
403教研室 韦素媛
11
(1)排它锁(X锁)
当某个事务T为修改某个数据项A且不允许其它事 务修改该数据项,或不允许其它事务对该数据 项加S锁时,则该事务可以对A加排它锁,排它 锁又称为写锁。
本事务:读A,修改A 其它事务:在T释放A上的X锁之前不能读A和修改
A
403教研室 韦素媛
12
(2)共享锁(S锁)
等待
Y 加X锁
T结束 释放X锁
本事务:读R,修改R;用COMMIT和ROLLBACK释放 X锁
其它事务:在T结束前不能读R,也不能修改R
作用:防止丢失修改
403教研室 韦素媛
17
(2)二级锁协议
二级锁协议除包括一级锁协议的内容外,还包括 如下规则:
事务T在读数据R之前必须先对数据R所在的项申 请加S锁,在获得了S加锁后,读完数据R后即可 释放所加的S锁。
缺点:制约数据库访问效率的瓶颈,不利于数据 库资源的利用。
并行访问,通过并发控制机制允许多个用户并 发地访问数据库。
403教研室 韦素媛
3
并发控制
当多个用户并发地访问数据库时就会产生多个事 务同时存取同一数据的情况。
若对并发操作不加以控制就会造成错误地存取数 据,破坏数据库的一致性。