数据库理论11

15.2

考虑下面两个事务:
$$
\begin{aligned}
T_{34}:&read(A);\\
&read(B);\\
&if\ A = 0 \ then\ B:=B+1\\
&write(B);
\end{aligned}
$$

$$
\begin{aligned}
T_{35}:&read(B);\\
&read(A);\\
&if\ B=0
\ then\ A:=A+1;\\
&write(A).
\end{aligned}
$$

给事务T与T增加加锁、解锁指令,使它们遵从两阶段封锁协议。这两个事务会引起死锁吗?

答:增加加锁解锁之后如下:
$$
\begin{aligned}
T_{34}:
&lock\ S(A)\\
&read(A);\\
&lock\ X(B)\\
&read(B);\\
&if\ A = 0 \ then\ B:=B+1\\
&write(B);\\
&unlock(A)\\
&unlock(B)\\
\end{aligned}
$$

$$
\begin{aligned}
T_{35}:
&lock\ S(B)\\
&read(B);\\
&lock\ X(A)\\
&read(A);\\
&if\ B = 0 \ then\ A:=A+1\\
&write(A);\\
&unlock(B)\\
&unlock(A)\\
\end{aligned}
$$

然后执行这两个事务的话是会造成死锁的,举例如下:

$T_{34}$先执行$lock\ S(A)$,

然后$T_{35}$执行$lock\ S(B)$和$read(B)$,

接着$T_{34}$执行$read(A)$和$lock\ X(B)$

这个时候$T_{34}$就会被阻塞,进而转到$T_{35}$执行,

而$T_{35}$执行的是$lock\ X(A)$,此时这个锁已经被另外一个事务获取了,故$T_{35}$也会被阻塞

此时就形成了死锁现象。