文章目录
1
1.1
R1(A)R2(A)W2(A)W1(A)
或者以表格的形式表示:
T1 T2
-----------------
Read(A)
Read(A)
Write(A)
Write(A)
在上面的调度中,事务T2写入的值由于事务T1的写入而丢失。
1.2
T1 T2
-----------------
Lock-S(A)
Read(A)
unlock(A)
Lock-X(A)
Read(A)
Write(A)
unlock(A)
commit
Lock-X(A)
Write(A)
unlock(A)
commit
上述调度中的封锁确保了已提交读隔离性的级别。但由事务T2写入的值因T1的写入而丢失。
1.3
2
2.1
考虑下面两个事务:
T1:read(A)
read(B)
if A=O then B:=B+1
write(B)
T2:read(B)
read(A)
if B=O then A:=A+1
write(A)
给事务T1与T2增加加锁、解锁指令,使它们遵从两阶段封锁协议。
T1:lock-S(A)
read(A)
lock-X(B)
read(B)
if A=O then B:=B+1
write(B)
unlock(A)
unlock(B)
T2:lock-S(B)
read(B)
lock-X(A)
read(A)
if B=O then A:=A+1
write(A)
unlock(B)
unlock(A)
2.2
行这些事务可能导致死锁。例如,考虑以下调度:
T1 T2
-----------------
Lock-S(A)
Read(A)
Lock-S(B)
Read(B)
Lock-X(B)
Lock-X(A)
此时调度出现了死锁。
3
3.1
考虑下面两个事务:
T1:read(A)
read(B)
if A=O then B:=B+1
write(B)
T2:read(B)
read(A)
if B=O then A:=A+1
write(A)
设一致性需求为A=0 ∨ B=0,初值是A=B=0。
说明包括这两个事务的每一个串行执行都保持数据库的一致性。
3.2
T1和T2的如下并发执行,将产生不可串行化调度:
T1 T2
----------------------------
Read(A)
Read(B)
Read(A)
Read(B)
if A=O then B:=B+1
if B=O then A:=A+1
Write(A)
Write(B)