数据库理论作业10
14.15
考虑下面两个事务:
$$
\begin{aligned}
T_{13}:&read(A);\\
&read(B);\\
&if\ A = 0 \ then\ B:=B+1\\
&write(B);
\end{aligned}
$$
$$
\begin{aligned}
T_{14}:&read(B);\\
&read(A);\\
&if\ B=0
\ then\ A:=A+1;\\
&write(A).
\end{aligned}
$$
设一致性需求为$A=0\vee B=0$,初值是$A=B=0$。
a. 说明包括这两个事务的每一个串行执行都保持数据库的一致性。
答:当先执行$T_{13}$再执行$T_{14}$时,情况如下:
过程 | A | B |
---|---|---|
初始值 | 0 | 0 |
$T_{13}$之后 | 0 | 1 |
$T_{14}$之后 | 0 | 1 |
完全执行完成之后,此时$A=0\vee B=0\equiv{False\vee True}\equiv True$
当先执行$T_{14}$再执行$T_{13}$时,情况如下:
过程 | A | B |
---|---|---|
初始值 | 0 | 0 |
$T_{14}$之后 | 1 | 0 |
$T_{13}$之后 | 1 | 0 |
完全执行完成之后,此时$A=0\vee B=0\equiv{True\vee False}\equiv True$
b.给出$T_{13}$和$T_{14}$的一次并发执行,执行产生不可串行化调度。
答:执行顺序如下:
步骤 | $T_{1}$ | $T_{2}$ |
---|---|---|
$1$ | $read(A);$ | |
$2$ | $read(B);$ | |
$3$ | $read(A);$ | |
$4$ | $read(B);$ | |
$5$ | $if\ A = 0 \ then\ B:=B+1;$ | |
$6$ | $if\ B=0\ then\ A:=A+1;$ | |
$7$ | $write(B)$ | |
$8$ | $write(A)$ |
c.存在产生可串行化调度的$T_{13}$和$T_{14}$的并发执行吗?
答:不存在。
比如说当$T_{13}$先执行了$read(A)$之后,此时在该进程中就会认为$A$一直等于$1$,在这个情况下无论之后执行顺序是怎么样的,$T_{13}$都会得到$B=1$的结果。而另一个进程$T_{14}$则有可能导致$A=1$也有可能导致$A=0$。若$A=1$了就会导致不满足题目要求的一致性需求,故不存在可串行化的并发执行。