问答题
[说明] 某省会城市XX长途汽车售票系统负责所有本地长途汽车站各班次的汽车票销售,并在该省会城市和全省主要地级市设有多个该长途汽车票销售网点,各售票网点使用相同的售票程序。假设售票程序中用到的伪指令如表8-2所示。
【正确答案】调度A结果:13
调度B结果:10
调度C结果:12
调度A和C结果错误,因为破坏了事务的隔离性。一个事务的执行结果被另一个所覆盖
【答案解析】[解析]
这是一道要求读者掌握并发情况下不同的调度可能产生不同结果的综合分析题。
由题意可知,两个售票网点同时销售长途汽车班次A的汽车票,初始状态下长途汽车班次A的汽车票数量x=15。
对于调度A,售票网点1通过伪指令“R1(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。而售票网点2也通过伪指令“R2(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。接着,售票网点1售出3张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-3)”,将当前数据库中长途汽车班次A的剩余汽车票数置为12(即15-3=12)。但是售票网点2售出两张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-2)”,将当前数据库中长途汽车班次A的剩余汽车票数重新置为13(即15-2=13)。
同理,对于调度B,售票网点1通过伪指令“R1(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。接着,售票网点1售出3张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-3)”,将当前数据库中长途汽车班次A的剩余汽车票数置为12(即15-3=12)。然后售票网点2通过伪指令“R2(A,x)”,获取长途汽车班次A当前的剩余汽车票数12,并赋给本地变量x。最后售票网点2售出两张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-2)”,将当前数据库中长途汽车班次A的剩余汽车票数置为10(即12-2=10)。
同理,对于调度C,售票网点1通过伪指令“R1(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。而售票网点2也通过伪指令“R2(A,x)”,获取长途汽车班次A当前的剩余汽车票数15,并赋给本地变量x。接着,售票网点2售出两张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-2)”,将当前数据库中长途汽车班次A的剩余汽车票数置为13(即15-2=13)。但是售票网点1售出3张长途汽车班次A的汽车票,并通过伪指令“W1(A,x-1)”,将当前数据库中长途汽车班次A的剩余汽车票数重新置为12(即15-3=12)。
综上所述,只有调度B执行完后的剩余票数是正确的。由于调度A和C破坏了事务的隔离性,一个事务的执行结果被另一个所覆盖,因此调度A和C的执行结果有错误。
【正确答案】(1)重写后的售票程序伪指令序列如下
Xlock(A); R(A,x); W(A,x-n); Unlock(A);
(2) ①封锁粒度与系统的并发度和并发控制的开销密切相关
② 封锁的粒度越大,并发度就越小,但系统开销就越小
③ 封锁的粒度越小,并发度就越高,但系统开销就越大
【答案解析】[解析]
这是一道要求读者掌握2PL协议实际应用、封锁粒度与并发度之间关系的综合应用题,本题所涉及的知识点如下。
(1) 多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同时,称这种调度策略为可串行化(Serializable)的调度。
可串行性(Serializability)是并发事务正确性的准则。按这个准则规定,一个给定的并发调度,当且仅当它是可串行化时,才认为是正确的调度。换而言之,事务并发调度是否正确,可通过对非冲突语句进行交换,若最终将并发调度通过交换非冲突语句转换成串行调度,则该并发调度为可串行化调度,可串行化调度被作为事务并发执行正确性的准则。
事务的提交是随机的,事务程序使用加锁可以实现并发事务的隔离性,使用两段锁协议(2PL)可以保证事务调度的可串行化。两段锁协议是指对数据读之前先加读锁,写前加写锁,事务只有获得相应的锁才能操作数据,加解锁过程分为两个阶段,前一阶段只能加锁,后一阶段只能解锁,不允许有交叉。两段锁协议是保证并发事务可串行化调度的充分条件。
针对题干所给出的伪指令操作序列:R(A,x);W(A,x-n),在事务读取数据之前加SLock()指令,写数据之前加XLock()指令,并保证读/写锁不交叉,即满足两段锁协议。重写后的售票程序伪指令序列如下。
XLock(A); R(A,x); W(A,x-n); Unlock(A);
(2) 封锁对象的大小称为封锁的粒度(Granularity)。封锁的对象可以是逻辑单元,也可以是物理单元。在关系数据库中,封锁对象可以是属性值、属性值集合、元组、关系、索引项、整个索引,以及整个数据库等逻辑单元,也可以是页(数据页或索引页)、块等物理单元。封锁对象可以很大,比如对整个数据库加锁,也可以很小,比如只对某个属性值加锁。X锁和S锁都是加在某一个数据对象上的。
封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的粒度越大,并发度就越小,但系统的开销也就越小;反之,封锁的粒度越小,并发度就越高,但系统开销也就越大。由此可见,在一个系统中同时存在不同大小的封锁单元供不同的事务选择使用是比较理想的。而选择封锁粒度时必须同时考虑封锁机构和并发度两个因素,对系统开销与并发度进行权衡,以求得最优的效果。通常,需要处理大量元组的用户事务可以以关系为封锁单元,而对于一个处理少量元组的用户事务,可以以元组为封锁单位以提高并发度。
【正确答案】(1)SERIALIZABLE
(2) balance = :x
(3) ROLLBACK WORK
(4) COMMT WORK
【答案解析】[解析]
这是一道要求读者掌握2PL协议理论与SQL中的隔离级别,以及嵌入式SQL的编程实践题。在嵌入式SQL编程中,使用标准SQL定义的隔离级别来实现事物并发执行下的一致性控制,4个隔离级别分别为Read Uncommitted、Read committed、Repeatable Read和Serializable。依题意,在题干所给出的长途汽车票销售程序中,空缺处(1)要补充的是可串行化调度级别,即SERlIALIZABLE。
空缺处(2)要补充的是嵌入式SQL的更新语句,即应填入balance = :x。
空缺(3)要补充的是嵌入式SQL中的事务回退语句,即应填入ROLLBACK WORK,以表示事务执行不成功地结束时通知系统已发生错误,数据库可能处在不正确的状态,该事务对数据库的所有更新必须被撤销,数据库应恢复该事务到初始状态。
空缺(4)要补充的是嵌入式SQL中的事务提交语句,即应填入COMMIT WORK,以表示事务执行成功地结束。此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都已交付实施(写入磁盘)。