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