|
案例:某航空公司售票系统负责所有起飞航班的机票销售业务,该公司设有多个机票销售网点,各售票网点使用相同的售票程序。假设系统有如下业务及规则:
|
|
|
|
|
|
(2)若某售票网点一次售出a张航班A的机票,则售票程序的伪指令序列为:R(A,x);W(A,x-a)。
|
|
|
(3)假设用E-SQL实现的机票销售程序的一部分(不完整),如下图所示。
|
|
|
|
|
|
【问题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)采用相应的加锁、解锁指令,重写售票程序的伪指令序列,以保证正确的并发调度。
|
|
|
|
|
|
在事务并发执行情况下,不同的调度可能产生不同的结果。针对两个并发执行的售票程序,可能会由于事务相互影响从而得到错误的结果。
|
|
|
|
考查对事务并发控制的相关知识的理解掌握。事务并发调度是否正确,可通过对非冲突命令进行交换,最终将并发调度转换成与某一串行化调度相同,则该并发调度为可串行化调度,可串行化调度被作为事务并发执行正确性的准则。
|
|
|
为保证可串行化调度,在事物执行过程中引入相应指令进行控制,即两段锁协议(2PL),即对数据读之前先加读锁,写前加写锁,事务只有获得相应的锁才能操作数据,加解锁过程分为两个阶段,前一阶段只能加锁,后一阶段只能解锁,不允许有交叉。两段锁协议是保证并发事务可串行化调度的充分条件。
|
|
|
针对给出的伪指令操作序列,在事务读取数据之前加Slock()指令,写数据之前加Xlock()指令,并保证读/写锁不交叉,即满足两段锁协议。
|
|
|
|
考查对2PL协议理论与SQL中的隔离级别以及嵌入式SQL的编程实践。其中,空(a)要补充的是嵌入式SQL的更新语句;空(b)要补充的是嵌入式SQL中的事务提交语句。
|
|
|
|
|
|
调度A、B结果错误,因为破坏了事务的隔离性。一个事务的执行结果被另一个所覆盖。
|
|
|
|
(1)判定事务并发执行正确性的准则是满足可串行化调度。要保证并发事务正确地执行,采用两段锁协议(2PL)。
|
|
|
(2)重写后的售票程序伪指令序列:XLock(A);R(A,x);W(A,x-a);Unlock(A);
|
|
|
|
空(a)balance=:x WHERE flight=‘A’
|
|
|
|