[说明]
某省会城市XX长途汽车售票系统负责所有本地长途汽车站各班次的汽车票销售,并在该省会城市和全省主要地级市设有多个该长途汽车票销售网点,各售票网点使用相同的售票程序。假设售票程序中用到的伪指令如表8-2所示。
假设某售票网点一次售出n张长途汽车班次A的汽车票,则售票程序的伪指令序列为:R(A,x);W(A,x-n)。根据上述业务及规则,完成下列问题。
1. 若两个售票网点同时销售长途汽车班次A的汽车票,在数据库服务器端可能出现如下的调度。
A:R1(A,x), R2(A,x), W1(A,x-3), W2(A,x-2);
B:R1(A,x), W1(A,x-3),R2(A,x), W2(A,x-2);
C:R1(A,x), R2(A,x), W2(A,x-2), W1(A,x-3);
其中Ri(A,x),Wi(A,x)分别表示第i个销售网点的读写操作,其余类同。
假设当前长途汽车班次A剩余15张汽车票,分析上述3个调度各自执行完后的剩余票数,并指出其中错误的调度,简要分析产生错误的主要原因。
参考答案:调度A结果:13
调度B结果:10
调度C结果:12
调度A和C结果错误,因为破坏了事务的隔离性。一个事务的执行结果被另一个所覆盖
解析:
这是一道要求读者掌握并发情况下不同的调度可能产生不同结果的综合分析题。
由题意可知,两个售票网点同时销售长途汽车班次A的汽车票,初始状态下长途汽车班次A的汽车票数量x=15。
对于调度A,售票网点1通过伪指令“R1(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。而售票网点2也通过伪指令“R2(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。接着,售票网点1售出3张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-3)”,将当前数据库中长途汽车班次A的剩余汽车票数置为12(即15-3=12)。但是售票网点2售出两张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-2)”,将当前数据库中长途汽车班次A的剩余汽车票数重新置为13(即15-2=13)。
同理,对于调度B,售票网点1通过伪指令“R1(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。接着,售票网点1售出3张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-3)”,将当前数据库中长途汽车班次A的剩余汽车票数置为12(即15-3=12)。然后售票网点2通过伪指令“R2(A,x)”,获取长途汽车班次A当前的剩余汽车票数12,并赋给本地变量x。最后售票网点2售出两张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-2)”,将当前数据库中长途汽车班次A的剩余汽车票数置为10(即12-2=10)。
同理,对于调度C,售票网点1通过伪指令“R1(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。而售票网点2也通过伪指令“R2(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。接着,售票网点2售出两张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-2)”,将当前数据库中长途汽车班次A的剩余汽车票数置为13(即15-2=13)。但是售票网点1售出3张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-1)”,将当前数据库中长途汽车班次A的剩余汽车票数重新置为12(即15-3=12)。
综上所述,只有调度B执行完后的剩余票数是正确的。由于调度A和C破坏了事务的隔离性,一个事务的执行结果被另一个所覆盖,因此调度A和C的执行结果有错误。