列表

详情


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

【说明】
某连锁酒店提供网上预订房间业务,流程如下:
(1)客户查询指定日期内所有类别的空余房间数,系统显示空房表(日期,房间类别,数量)中的信息;
(2)客户输入预订的起始日期和结束日期、房间类别和数量,并提交;
(3)系统将用户提交的信息写入预订表(身份证号,起始日期,结束日期,房间类别,数量),并修改空房表的相关数据。
针对上述业务流程,回答下列问题。

【问题1】(3分)
如果两个用户同时查询相同日期和房间类别的空房数量,得到的空房数量为1,并且这两个用户又同时要求预订,可能会产生什么结果,请用100字以内文字简要叙述。
【问题2】(8分)
引入如下伪指令:将预订过程作为一个事务,将查询和修改空房表的操作分别记为R(A)和W(A,x),插入预订表的操作记为W(B,a),其中x代表空余房间数,a代表预订房间数。则事务的伪指令序列为:x = R(A),W(A,x-a),W(B,a)。
在并发操作的情况下,若客户1、客户2同时预订相同类别的房间时,可能出现的执行序列为:x1=R(A), x2 = R(A), W(A, x1-a1), W(B1,a1), W(A, x2-a2), W(B2,a2)。

(1)此时会出现什么问题,请用100字以内文字简要叙述。
(2)为了解决上述问题,引入共享锁指令SLock(X)和独占锁指令XLock(X)对数据 X进行加锁,解锁指令Unlock(X)对数据X进行解锁,请补充上述执行序列,使其满足 2PL协议,使其不产生死锁且持有锁的时间最短。
【问题3】(4分)
下面是实现预订业务的程序,请补全空缺处的代码。其中主变量:Cid,:Bdate,  :Edate,
:Rtype, :Num 分别代表身份证号,起始日期,结束日期,房间类别和订房数量。
SET  TRANSACTION  ISOLATION  LEVEL  REPEATABLE READ;
UPDATE 空房表 
SET数量=数量 -  :Num
WHERE__(a)__;
if error then { ROLLBACK; return -1;}
INSERT INTO 预订表 VALUES (:Cid, :Bdate,:Edate,:Rtype,:Num);
if error then { ROLLBACK; return -2 ; }
__(b)__; .

参考答案:

【问题1】(3分)
同时预订时,可能会产生一个客户订不到或者把同一房订给两个客户
【问题2】(8分)
出现问题:丢失修改,客户1预订a1数量房间后,对空房数量的修改被T2的修改覆盖,造成数据不一致。(4分)

XLOCK(A),x1=R(A),W(A,x1-a1),XLOCK(B),UNLOCK(A),W(B1,a1),UNLOCK(B),    XLOCK(A), x2=R(A),W(A,x2-a2),XLOCK(B),UNLOCK(A),W(B2,a2),UNLOCK(B)(4分)

【问题3】(4分)
(a)房间类别=:Rtype   AND 日期 BETWEEN :Bdate  AND :Edate(2分)
(b)COMMIT;Return 0;(2分)

详细解析:

【问题1】

由于只有1个空房间,当第一用户订购后,第二个用在预订,由于第一个用户已经成功预订,则空房间数就会减去1,这时所剩空房间数位0,所以第二个用户预订不成功;如果两个用户同时预订,由于两个用户同时读取数据时存在1个空房间,满足条件,因此会导致两个用户都能预订成功,即两个用户同时预订了一个房间
【问题2】

(1)x1=R(A), x2 = R(A), W(A, x1-a1), W(B1,a1), W(A, x2-a2), W(B2,a2),该指令序列中 x1的更新被 x2的更新覆盖,即出现了丢失更新。(2)题干要求符合2PL,2PL是两段锁协议:对任何数据进行读写之前必须对该数据加锁,在释放了一个封锁之后,事务不再申请和获得任何其他封锁。这就缩短了持锁时间,提高了并发性,同时解决了数据的不一致性。两段封锁协议可以保证可串行化,它把每个事务分解为加锁和解锁两段。增长阶段。事务可以获取锁,但不能释放锁。缩减阶段。事务只能释放锁,不能获取锁。同时题干又要求时间最短,所以正确的顺序为:XLOCK(A), x1=R(A),W(A, x1-a1  ),XLOCK(B),UNLOCK(A),W(  B1,a1  ),UNLOCK(B)

【问题3】

题干中要求用户输入预订的起始日期和结束日期,房间类别和数量,因此在该嵌入式SQL语句的WHERE条件处应该要限制起始日期、结束日期,房间类别,而代表该值的主变量分别为::Bdate  :Edate  :Rtype。所以(a)处应该填写的内容为:房间类别=:Rtype AND 日期 BETWEEN:Bdate AND:Edate;(b)处是整个事务成功结束时的提交语句,所以应该填写:COMMIT;Return 0;

上一题