问答题 试题五(共15分) 阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。 [说明] 假设有两项业务对应的事务T1、T2与存款关系有关: . 转账业务:T1(A,B,50),从账户A向账户B转50元; . 计息业务:T2,对当前所有账户的余额计算利息,余额为X*l.01 针对上述业务流程,回答下列问题:
问答题 [问题1](3分) 假设当前账户A余额为100元,账户B余额为200元。有两个事务分别为T1(A,B,50),T2,一种可能的串行执行为: T1(A,B,50)->T2 结果:A=50.5 B=252.5 A+B=303 请给出其他的串行执行次序和结果。
【正确答案】T2->T1(A,B,50) 结果: A=51 B=252 A+B=303
【答案解析】 本题考查对事务设计、并发控制的理解和掌握。 两个事务T1、T2的串行执行只有两种方式:Tl执行完执行T2(记为:T1->T2)和T2执行完执行Tl(记为:T2->T1),结合A、B的初值,即可计算出T2->Tl的执行结果。 根据A、B的初值,按照给定的调度,获得执行结果为:A=50.5,B=252,与任何一个串行执行的结果都不同,为错误的调度,事实上会造成储户的无端损失。 引入两段锁协议后可保证调度的正确。根据锁类型和加解锁的要求,本题中所有的读取随后即要修改,对应了SQL中的UPDATE指令,可直接加X锁,具体参见参考答案。 若将计息业务T2改为对单个账户的余额计算利息,根据提示的情况,调度结果可能存在不一定性,这样的事务设计是错误的。
问答题 [问题2](8分) 若上述两个事务的一个并发调度结果如下: (1)上述调度是否正确,为什么? (3分) (2)引入共享锁指令Slock()、独占锁指令Xlock()和解锁指令Unlock(),使上述调度满足两段锁协议,并要求先响应T1的请求。请给出一个可能的并发调度结果。(5分)
【正确答案】 (1)调度不正确 结果为:A=50.5 B=252 原因:与任何一个串行结果都不同。 (2)满足两段锁协议的调度:
【答案解析】 本题考查对事务设计、并发控制的理解和掌握。 两个事务T1、T2的串行执行只有两种方式:Tl执行完执行T2(记为:T1->T2)和T2执行完执行Tl(记为:T2->T1),结合A、B的初值,即可计算出T2->Tl的执行结果。 根据A、B的初值,按照给定的调度,获得执行结果为:A=50.5,B=252,与任何一个串行执行的结果都不同,为错误的调度,事实上会造成储户的无端损失。 引入两段锁协议后可保证调度的正确。根据锁类型和加解锁的要求,本题中所有的读取随后即要修改,对应了SQL中的UPDATE指令,可直接加X锁,具体参见参考答案。 若将计息业务T2改为对单个账户的余额计算利息,根据提示的情况,调度结果可能存在不一定性,这样的事务设计是错误的。
问答题 [问题3](4分) 若将计息业务T2改为对单个账户的余额计算利息,即T2(A)余额为A*1.01,请给出串行调度T1(A,B,50)->T2(A)->T2(B)和串行调度T2(A)->T1(A,B,50)->T2(B)的执行结果。
【正确答案】 三个事务的串行: (1) T1(A,B,50)->T2(A)->T2(B) 结果:A=50.5 B=252.5 (2) T2(A)->T1(A,B,50)->T2(B) 结果:A=51 B=252.5 不正确。计息业务设计为对单个账户的余额计算利息,无法实现对所有账户的锁定和统一计息,其间的转账会产生数据错误,会造成银行或客户的损失。
【答案解析】 本题考查对事务设计、并发控制的理解和掌握。 两个事务T1、T2的串行执行只有两种方式:Tl执行完执行T2(记为:T1->T2)和T2执行完执行Tl(记为:T2->T1),结合A、B的初值,即可计算出T2->Tl的执行结果。 根据A、B的初值,按照给定的调度,获得执行结果为:A=50.5,B=252,与任何一个串行执行的结果都不同,为错误的调度,事实上会造成储户的无端损失。 引入两段锁协议后可保证调度的正确。根据锁类型和加解锁的要求,本题中所有的读取随后即要修改,对应了SQL中的UPDATE指令,可直接加X锁,具体参见参考答案。 若将计息业务T2改为对单个账户的余额计算利息,根据提示的情况,调度结果可能存在不一定性,这样的事务设计是错误的。