9.
设T1、T2、T3是如下的三个事务,设A的初值是0。
T1:A:=A+2;
T2:A:=A*2;
T3:A:=A**2;
(1)
若这三个事务允许并发执行,则有多少可能的正确结果。
串行执行次序有:
T1、T2、T3
T1、T3、T2
T2、T1、T3
T2、T3、T1
T3、T1、T2
T3、T2、T1
执行结果分别为:16,8,4,2,4,2
一共有4种可能的正确结果,分别为2,4,8,16
(2)
请给出一个可串行化的调度,并给出执行结果。
T1 | T2 | T3 |
---|---|---|
Slock A | ||
R(A)=0 | ||
Unlock A | ||
Xlock A | ||
SlockA | ||
A=A+2 | 等待 | |
W(A)=2 | 等待 | |
Unlock A | 等待 | |
R(A)=2 | ||
Unlock A | ||
Xlock A | ||
Slock A | ||
A=A*2 | 等待 | |
W(A)=4 | 等待 | |
Unlock A | 等待 | |
R(A)=4 | ||
Unlock A | ||
Xlock A | ||
A=A**2 | ||
W(A)=16 | ||
Unlock A |
(3)
请给出一个非串行化的调度,并给出执行结果。
T1 | T2 | T3 |
---|---|---|
Slock A | ||
R(A)=0 | ||
Unlock A | ||
Slock A | ||
R(A)=0 | ||
Xlock A | ||
等待 | Unlock A | |
A=A+2 | ||
W(A) =2 | Slock A | |
Unlock A | 等待 | |
R(A)=2 | ||
Unlock A | ||
Xlock A | ||
Xlock A | ||
等待 | A=A**2 | |
等待 | W(A)=4 | |
等待 | Unlock A | |
A=A*2 | ||
W(A)=0 | ||
Unlock A |
(4)
若这三个事务都遵守两端锁协议,请给出一个不产生死锁的可串行化调度。
T1 | T2 | T3 |
---|---|---|
Slock A | ||
R(A)=0 | ||
Xlock A | ||
A=A+2 | Slock A | |
W(A)=2 | 等待 | |
Unlock A | 等待 | |
R(A)=2 | ||
Xlock A | ||
Unlock A | 等待 | Slock A |
A=A*2 | 等待 | |
W(A)=4 | 等待 | |
Unlock A | 等待 | |
R(A)=4 | ||
Unlock A | ||
Xlock A | ||
A=A**2 | ||
W(A)=16 | ||
Unlock A | ||
Unlock A |
(5)
若这三个事务都遵守两端锁协议,请给出一个产生死锁的调度。
T1 | T2 | T3 |
---|---|---|
Slock A | ||
R(A)=0 | ||
Slock A | ||
R(A)=0 | ||
Xlock A | ||
等待 | ||
等待 | ||
… | Xlock A | |
等待 | ||
… | Slock A | |
R(A)=0 | ||
Xlock A | ||
等待 | ||
… |
10.
今有三个事务的一个调度r3(B)r1(A)w3(B)r2(B)r2(A)w2(B)r1(B)w1(A),该调度是冲突可串行化的调度吗?
<1> 由于r1(A)和w3(B)是不冲突操作,交换r1(A)、w3(B),可得
r3(B)w3(B)r1(A)r2(B)r2(A)w2(B)r1(B)w1(A)
<2> 由于r1(A)和r2(B)r2(A)w2(B)是不冲突操作,交换,可得
r3(B)w2(B)r2(B)r2(A)w2(B)r1(A)r1(B)w1(A)是一个串行调度
所以原调度是冲突可串行化调度。
14.
对于T1和T2:
T1:R(A);R(B);B=A+B;W(B)
T1:R(B);R(A);A=A+B;W(A)
(1)
改写T1和T2,增加加锁操作和解锁操作,并要求遵循两阶段封锁协议。
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的执行是否会引起死锁,给出T1和T2的一个调度并说明之。
会引起死锁。
T1 | T2 |
---|---|
Slock A | |
R(A) | |
Slock B | |
R(B) | |
Slock B | |
R(B) | |
Xlock B | |
等待 | Slock A |
等待 | R(A) |
等待 | Xlock A |
… | 等待 |
总结:
1.排他锁–写锁–X锁;共享锁–读锁–S锁
2.死锁:T1等待T2,T2等待T1.两个事务永远不能结束,形成死锁。
3.通过交换不冲突的操作得到新调度,如果新调度是串行的,称原调度是冲突可串行化调度。
4.如果一个调度是冲突可串行化,则一定是可串行化的调度。
完。