某航空售票系统负责所有本地起飞航班的机票销售,并设有多个机票销售网点。各售票网点使用相同的售票程序。假设售票程序中使用到的伪指令如下表所示。 伪指令 说明 R(A,x) 返回航班 A 当前的剩余机票数给变量 x W(A,x) 当前数据库中航班 A 的剩余机票数置为 x 假设某售票网点一次售出 a 张航班 A 的机票,则售票程序的伪指令序列为: R(A,x) ; W(A,X-a) 。根据上述业务规则,完成下列问题: 【问题 1 】 若两个售票网点同时销售航班 A 的机票,在数据库服务器端可能出现如下的调度:
A.
R1(A,x),R2(A,x),W1(A,x-1),W2(A,x-2) ;
B.
R1(A,x),R2(A,x),W2(A,x-2),W1(A,x-1) ;
C.
R1(A,x),W1(A,x-1), R2(A,x),W2(A,x-2) ; 其中 Ri(A,x) 、 Wi(A,x) 分别表示第 i 个销售网点的读写操作,其余类同。假设当前航班 A 的剩余 15 张机票,分析上述 3 个调度各自执行完成后的剩余票数,并指出错误的调度及产生错误的原因。 【问题 2 】 (1) 判断事务并发执行正确性的准则是什么?如何保证并发事务正确地执行? (2) 引入相应的加解锁指令,重写售票程序的伪指令序列,以保证正确的并发调度。 【问题 3 】 下面是用 E-SQL 实现的机票销售程序的一部分代码,请补全空缺处的内容。 EXEC SQL SETTRANSACTION ISOLATION LEVEL SERIALIZABLE EXEC SQL SELECTbalance INTO : x FRPMtickets WHERE flight=’A’; printf(“ 航班 A 当前剩余机票数为: %d\n 请输入够票数: ”,x); scanf(“%d”,&a); x=x-a; if(x<0) EXEC SQL ROLLBACK WORK; printf ( ” 票数不够,购票失败 ” ) ; else{ EXEC SQL ( a ) tickets SET (b) ; if(SQLCA . sqlcode<>SUCCESS) EXEC SQL ROLLBACK WORK; else (c) ; }