阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】某高速路不停车收费系统(ETC)的业务描述如下:(1)车辆驶入高速路入口站点时,将驶入信息(ETC卡号,入口编号,驶入时间)写入登记表;(2)车辆驶出高速路出口站点(收费口)时,将驶出信息(ETC卡号,出口编号,驶出时间)写入登记表;根据入口编号、出口编号及相关收费标准,清算应缴费用,并从绑定的信用卡中扣除费用。一张ETC卡号只能绑定一张信用卡号,针对企业用户,一张信用卡号可以绑定多个ETC卡号。使用表绑定(ETC卡号,信用卡号)来描述绑定关系,从信用卡(信用卡号,余额)表中扣除费用。针对上述业务描述,完成下列问题:【问题1】在不修改登记表的表结构和保留该表历史信息的前提下,当车辆驶入时,如何保证当前ETC卡已经清算过,而在驶出时又如何保证该卡已驶入而未驶出?请用100字以内文字简述处理方案。【问题2】当车辆驶出收费口时,从绑定信用卡余额中扣除费用的伪指令如下:读取信用卡余额到变量X,记为x=R(A);扣除费用指令x=x-a;写信用卡余额指令记为W(A,x)。(1)当两个绑定到同一信用卡号的车辆同时经过收费口时,可能的指令执行序列为:x1=R(A),x1=x1-a1,x2=R(A),x2=x2-a2,W(A,x1,W(A,x2)。此时会出现什么问题?(100字以内)(2)为了解决上述问题,引入独占锁指令XLock(A)对数据A进行加锁,解锁指令Unlock(A)对数据A进行解锁。请补充上述执行序列,使其满足2PL协议。【问题3】下面是用E-SQL实现的费用扣除业务程序的一部分,请补全空缺处的代码。CREATEPROCEDURE扣除(INETC卡号VARCHAR(20),IN费用FLOAT)BEGINUPDATE信用卡SET余额=余额-费用FROM信用卡,绑定WHERE信用卡.信用卡号=绑定.信用卡号AND(a);iferrorthenROLLBACK;else(b);END
【问题1】在车辆驶入时判定登记表上对应该ECT卡的所有记录,出口编号和驶出时间均不为空,表示该卡已清算过;在车辆驶出时判定该卡存在记录有驶入信息而出口编号和驶出时间为空。【问题2】(1)出现问题:丢失修改,x1的费用扣除后写入的值被x2的覆盖,造成对x1并未扣费。(2)加锁后的执行序列:XLock(A), x1=R(A), x1=x1-a1, W(A,x1), Unlock(A), XLock(A), x2 = R(A), x2 = x2-a2, W(A,x2), Unlock(A)。【问题3】(a) ETC卡号=:ETC卡号(c)COMMIT 【解析】 【问题1】【试题分析】本题考査事务概念及应用,属于比较传统的题目,考查点也与往年类似。本问题考查应用需求。一次通过包含经过入口站点和经过出口站点,由于ETC卡存在反复使用,所以应将经过入口和出口严格配对。根据历史记录,进入站点时应该没有 未配对的入口信息,即所有的经过信息均有配对的入口和出口记录;出口时仅有唯一的入口信息。 .解决这些问题的最好办法是把入口和出口信息作为一条记录,用来记录每一次经过。经过入口站点时插入新记录,出口信息字段为空值,经过出口站点时再修改为相应的值。【问题3】【试题分析】本问题考查并发控制。两辆车同时经过收费口,会对信用卡的同一余额数据进行操作,可能会造成数据的不一致。根据给定的指令执行序列"x1= R(A),x1= x1- a1,x2 = R(A), x2 = x2-a2, W(A,x1), W(A,x2)",W(A,x1)指令对数据对象A 写入的x1值会被随后的x2值所指盖,造成丢失修改的错误。解决的办法是引入锁机制,在修改数据前加独占锁,写入数据后再释放锁,符合两段锁协议的规定,则会避免产生数据不一致性问题。【问题3】【试题分析】本问题考查存储过程及事务程序的实现。修改语句中条件部分的空缺为输入参数中的ETC卡号,判定语句中的空缺为事务的提交指令。