[说明]
某停车场有多个入口和出口,车辆进入时从入口处由系统查询可用的停车位,从出口驶出时系统将其刚使用的车位标记为空车位。
假设实现停车场管理的伪指令如下表1所示:
问答题 [问题1]
若两辆车在不同的入口处同时执行上述代码,会出现什么问题? (100字以内描述)
【正确答案】
【答案解析】若两辆车在不同的入口处同时执行代码,可能造成两辆车争用同一停车位。即两车同时申请到一个停车位,并置为占用状态。 [解析] 本题考查并发控制的概念和应用,属于比较传统的题目,考查点也与往年类似。
[问题1]考查对并发情况下,会产生数据的不一致性问题,要求结合理论知识与实际问题,找出问题所在。两车同时读空车位时,可能会读到同一空车位,进而占用造成突,与并发控制中的丢失修改错误相类似。
问答题 [问题1]
为保证入口处伪代码正确地并发执行,引入共享锁指令SLock(T)和独占锁指令XLock(T)对表T进行加锁;Upgrade(T)对表T所加的共享锁升级为独占锁;解锁指令 Unlock(T)对表T进行解锁。
(1)请修改上述入口处的伪代码程序,使其满足2PL协议。
(2)满足2PL协议的入口处的伪代码程序,在并发执行时是否会产生死锁?若是,给出一个产生死锁的调度。
【正确答案】
【答案解析】(1)满足2PL协议的伪代码:
SLock(T);
x=Get();
IF x=NULL THEN return 0;
Upgrade(T)
Writ(x,1);
Unlock(T);
(2)会产生死锁,调度如下:
填空题 [问题3]
若停车位表的关系模式为:park(parkno,isused),其中parkno为停车位号,isused为停车位标志,0为空,1为非空。
下面是用E-SQL实现的查询空车位的函数Get(),请补全空缺处的代码。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
EXEC SQL DECLARE getblk CURSOR FOR
__(a)__
EXEC SQL OPEN getblk;
EXEC SQL FETCH getblk INTO:Hparkno;//Hparkno为已声明的主变量
IF SQLCA.sqlcode=100 THEN
EXEC SQL CLOSE getblk; Return NULL;
ELSE
__(b)__
END IF