[说明]
某省会城市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个调度各自执行完后的剩余票数,并指出其中错误的调度,简要分析产生错误的主要原因。
参考答案:(1)SERIALIZABLE
(2) balance = :x
(3) ROLLBACK WORK
(4) COMMT WORK
解析:
这是一道要求读者掌握2PL协议理论与SQL中的隔离级别,以及嵌入式SQL的编程实践题。在嵌入式SQL编程中,使用标准SQL定义的隔离级别来实现事物并发执行下的一致性控制,4个隔离级别分别为Read Uncommitted、Read committed、Repeatable Read和Serializable。依题意,在题干所给出的长途汽车票销售程序中,空缺处(1)要补充的是可串行化调度级别,即SERlIALIZABLE。
空缺处(2)要补充的是嵌入式SQL的更新语句,即应填入balance = :x。
空缺(3)要补充的是嵌入式SQL中的事务回退语句,即应填入ROLLBACK WORK,以表示事务执行不成功地结束时通知系统已发生错误,数据库可能处在不正确的状态,该事务对数据库的所有更新必须被撤销,数据库应恢复该事务到初始状态。
空缺(4)要补充的是嵌入式SQL中的事务提交语句,即应填入COMMIT WORK,以表示事务执行成功地结束。此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都已交付实施(写入磁盘)。