摘要:2010年上半年数据库系统工程师考试真题及答案解析下午卷 试题五 阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。
下午卷
试题五
阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。
[说明]
某航空售票系统负责所有本地起飞航班的机票销售,并设有多个机票销售网点。各售票网点使用相同的售票程序。假设售票程序中用到的伪指令如表5-1所示。
假设某售票网点一次售出a张航班A的机票,则售票程序的伪指令序列为:R(A,x);W(A,X-a)。根据上述业务及规则,完成下列问题:
[问题1]
若两个售票网点同时销售航班A的机票,在数据库服务器端可能出现如下的调度:
A:R1(A,x),R2(A,X),W1(A,x-1),W2(A,x-2);
B:R1(A,x),R2(A,x),W2(A,x-2),W1(A,x-1);
C:R1(A,x),W1(A,x-1),R2(A,X),W2(A,x-2);
其中Ri(A,x),Wi(A,x)分别表示第i个销售网点的读写操作,其余类同。
假设当前航班A剩余10张机票,分析上述三个调度各自执行完后的剩余票数,并指出错误的调度及产生错误的原因。
[问题2]
(1)判定事务并发执行正确性的准则是什么?如何保证并发事务正确地执行?
(2)引入相应的加解锁指令,重写售票程序的伪指令序列,以保证正确的并发调度。
[问题3]
下面是用E-SQL实现的机票销售程序的一部分,请补全空缺处的代码。
EXEC SQL SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
EXEC SQL SELECT balance INTO :x FROM tickets WHERE flight='A';
printf("航班A当前剩余机票数为:%d\n请输入购票数:",x);
scanf("%d",&a);
x=x-a;
if(x<0)
EXEC SQL ROLLBACK WORK;
printf("票数不够,购票失败!");
else{
EXEC SQL UPDATE tickets SET (a)
if(SQLCA.sqlcode<>SUCCESS)
EXEC SQL ROLLBACK WORK;
else (b) }
试题五分析
本题考查的是并发控制的概念和应用,属于比较传统的题目,考查点也与往年类似。
[问题1]
本问题考查并发情况下不同的调度可能产生不同结果的情况。针对两个并发执行的售票程序,会相互影响从而得到错误的结果。
[问题2]
本问题考查对事务并发控制的相关知识的理解掌握。事务并发调度是否正确,可通过对非冲突语句进行交换,若最终将并发调度通过交换非冲突语句转换成串行调度,则该并发调度为可串行化调度,可串行化调度被作为事务并发执行正确性的准则。
为保证可串行化调度,在事物执行过程中引入相应指令进行控制,即两段锁协议(2PL),即对数据读之前先加读锁,写前加写锁,事务只有获得相应的锁才能操作数据,加解锁过程分为两个阶段,前一阶段只能加锁,后一阶段只能解锁,不允许有交叉。两段锁协议是保证并发事务可串行化调度的充分条件。
针对给出的伪指令操作序列,在事务读取数据之前加Slock()指令,写数据之前加Xlock()指令,并保证读/写锁不交叉,即满足两段锁协议。
[问题3]
本问题考查对2PL协议理论与SQL中的隔离级别,以及嵌入式SQL的编程实践。 本地给出的空缺(a)要补充的是嵌入式SQL的更新语句;空缺(b)要补充的是嵌入式SQL中的事务提交语句。
参考答案
[问题1]
调度A结果:8
调度B结果:9
调度C结果:7
调度A、B结果错误,因为破坏了事务的隔离性。一个事务的执行结果被另一个所覆盖。
[问题2]
(1)判定事务并发执行正确性的准则是满足可串行化调度。要保证并发事务正确地执行,采用两段锁协议(2PL)。
(2)重写后的售票程序伪指令序列:
XLock(A);
R (A,x);
w (A, x-a);
Unlock(A);
[问题3]
(a)balance= :x WHERE flight='A'
(b)(b)EXEC SQL COMMIT WORK
相关链接:
数据库系统工程师考试知识点分析与真题详解(第4版)
数据库系统工程师考试历年试题分析与解答(第4版)
数据库系统工程师考试下午知识点精讲与考前必练
数据库系统工程师考试考前串讲
软考备考资料免费领取
去领取