用看的、听的学真题

study by eyes and ears.

  1. 首页
  2. 数据库系统工程师
  3. 2017年05月数据库系统工程师考试下午真题【应用技术】
  4. 真题详解

2017年05月数据库系统工程师考试下午真题【应用技术】(第5题) 收藏

【5】

阅读下列说明,回答问题1和问题2,将解答填入答题纸的对应栏内。

【说明】

  某抢红包软件规定发红包人可以一次抛出多个红包,由多个人来抢。要求每个抢红包的人最多只能抢到同一批次中的一个红包,且存在多个人同时抢同一红包的情况。给定的红包关系模式如下:

  Red(ID,BatchID,SenderID,Money,ReceiverID)

  其中ID唯一标识每一个红包;BatchID为发红包的批次,一个BatchID值可以对应多个ID值;SenderID为发红包人的标识;Money为红包中的钱数;ReceiverID记录抢到红包的人的标识。

  发红包人一次抛出多个红包,即向红包表中插入多条记录,每条记录表示一个红包,其ReceiverID值为空值。

  抢某个红包时,需要判定该红包记录的ReceiverID值是否为空,不为空时表示该红包己被抢走,不能再抢,为空时抢红包人将自己的标识写入到ReceiverID宇段中,即为抢到红包。

问题1 (9.0分)

  引入两个伪指令a=R(X)和W(b,X)。其中a=R(X)表示读取当前红包记录的ReceiverID字段(记为数据项X)到变量a中,W(b,X)表示将抢红包人的唯一标识b的值写入到当前红包记录的ReceiverID字段(数据项X)中,变量a为空值时才会执行W(b,X)操作。假设有多个人同时抢同一红包(即同时对同一记录进行操作),用ai=Ri(X)和Wi(bi,X)表示系统依次响应的第i个人的抢红包操作。假设当前数据项X为空值,同时有三个人抢同一红包,则

  (1)如下的调度执行序列:

  a1=R1(X),a2=R2(X),W1(b1,X),W2(b2,X),a3=R3(X)

  抢到红包的是第几人?并说明理由。

  (2)引入共享锁指令SLock i(X)、独占锁指令XLock i(X)和解锁指令ULock i(X),其中下标i表示第i个抢红包人的指令。如下的调度执行序列:

  SLock1(X),a1=R1(X),SLock 2(X),a2=R2(X),XLock 1(X)……

  是否会产生死锁?并说明理由。

  (3)为了保证系统第一个响应的抢红包人为最终抢到红包的人,请使用上述(2)中引入的锁指令,对上述(1)中的调度执行序列进行修改,在满足2PL协议的前提下,给出一个不产生死锁的完整的调度执行序列。

暂无

问题2 (6.0分)

  下面是用SQL实现的抢红包程序的一部分,请补全空缺处的代码

  CREATE PROCEDURE ScrambleRed(IN BatchlNo VARCHAR(20),IN RecvrNo VARCHAR(20))

  BEGIN

  --红包批号--接收红包者--是否已抢过此批红包

  if exists(SELECT * FROM Red

    WHERE BatchID=BatchNo AND ReceiverID=RecvrNo) then

    return -1;

  end if

  --读取此批派发红包中未领取的红包记录ID

  DECLARE NonRecvedNO VARCHAR(30)

  DECLARE NonRecvedNO CURSOR FOR

  SELECT ID FROM Red

    WHERE BatchID=BatchNo AND ReceiverID IS NULL;

  --打开游标

  OPEN NnoRecvedRed;

  FETCH NonRecvedRed INTO NonRecvedNo;

  while not error

  --抢红包事务

    BEGIN TRANSACTION;

  --H写入红包记录

    UPDATE Red STE ReceiverID=RecvrNo

      WHERE ID=nonRECVED AND(a)

  --执行状态判定

    If(修改的记录数)=1 THEN

      COMMIT

      (b)

      Return 1

    Else

      ROLLBACK

    End if

  (c)

  End while

  --关闭游标

  CLOSE NnoRecvedRed

  Return 0;

  END

暂无
广告位