一、题目描述
14.考虑T和T2两个事务。
T1: R(A); R(B);B=A+ B; W(B)
T2: R(B); R(A);A=A+ B; W(A)
(1)改写T和T2, 增加加锁操作和解锁操作,并要求遵循两阶段封锁协议。
(2)说明T和T2的执行是否会引起死锁,给出T和T2的一个调度并说明之。
二、问题解答
(1)如下表所示
T1 |
T2 |
Slock A |
|
R(A) |
|
Slock B |
|
R(B) |
|
Xlock B |
|
B=A+B |
|
W(B) |
|
Unlock B |
|
|
Slock B |
|
R(B) |
Unlock B |
|
Unlock A |
|
|
Slock A |
|
R(A) |
|
Xlock A |
|
A=A+B |
|
W(A) |
|
Unlock A |
|
Unlock A |
|
Unlock B |
(2)如下调度会引起死锁:
T1 |
T2 |
Slock A |
|
R(A) |
|
|
Slock B |
|
R(B) |
SlockB |
|
R(B) |
|
Xlock B |
|
等待 |
Slock A |
等待 |
R(A) |
等待 |
Xclock A |
|
等待 |
ps:
死锁的定义:如果事务T1封锁了数据R,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2, 于是T1等待T2释放R2上的锁:接着T2又申请封锁R,因T1已封锁了R1, T2也只能等待T1释放R上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。