【正确答案】(1)满足2PL协议的伪代码 SLock(T); x = Get(); IF x = NULL THEN return 0; Upgrade(T); Writ(x,1); Unlock(T); (2) 会产生死锁 一个产生死锁的调度示例如表8-6所示(注:调度次序不局限于本参考答案,但执行语句不能写在一行,必须是并发而不能是串行,且在Upgrade后等待)
【答案解析】[解析] 这是一道要求读者掌握2PL协议实际应用的综合理解题,本试题的解答思路如下。 (1) 2PL协议规定:读数据前加S锁,事务结束时释放;写数据前加X锁,事务结束时释放;当要修改数据时,事务应对自己的加的S锁升级为X锁。 为保证入口处伪代码正确地并发执行,引入共享锁指令SLock(T)和独占锁指令XLock(T)对表T进行加锁;Upgrade(T)用于对表T所加的共享锁升级为独占锁;解锁指令Unlock(T)用于对表T进行解锁。满足2PL协议入口处的伪代码程序如下。 SLock(T); x = Get (); IF x = NULL THEN return 0; Upgrade (T); Writ (x,1); Unlock (T); (2) 2PL协议解决的是事务并发时的正确调度,并不能解决死锁问题。通常,死锁问题是由数据库管理系统(DBMS)进行检测和解除的。因此,满足2PL协议的入口处的伪代码程序,在并发执行时还有可能会产生死锁。例如,一个产生死锁的调度示例如表8-6所示。 [*]
【正确答案】(1)storage_rackno (2) from storage_rack (3) where isused=0 (4) EXEC SQL CLOSE getblk (5) Hparkno
【答案解析】[解析] 这是一道要求读者掌握2PL协议理论与SQL中的隔离级别,以及嵌入式SQL的编程实践题。 依题意,在用E-SQL语句实现的查询货架位置的函数Get()中,(1)~(3)空缺处需要补充的是游标定义中的查询部分;(4)和(5)空缺处需要补充的是关闭游标和函数返回值部分。函数Get()完整的程序代码如下。 SET TRAMSACTION ISOLATION LEVEL SERIALIZABLE EXEC SQL DECLARE getblk CURSOR FOR select storage rackno trom storage rack where isused=0; EXEC SQL OPEN getblk ; EXEC SQL FETCH getblk INTO :Hparkno; //Hparkno 为已声明的主变量 IF SQLCA.sqlcode = 100 THEN EXEC SQL CLOSE getblk ; Return NULL; ELSE EXEC SQL CLOSE getblk; return :Hparkno; END IF