阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某航空售票系统负责所有本地起飞航班的机票销售,并设有多个机票销售网点。以下为E一SQL编写的部分售票代码: EXEC soL SELECT balance INTO:

admin2016-09-08  11

问题 阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
    某航空售票系统负责所有本地起飞航班的机票销售,并设有多个机票销售网点。以下为E一SQL编写的部分售票代码:
    EXEC soL SELECT balance INTO:x FROM tickets WHERE flight=:flightno;
    printf(”航班%s当前剩余机票数为:%d\n请输入购票数:",  flightno,x);
    scanf("%d",  &a);
    EXEC soL UPDATE tickets SET balance =x =:a WHERE flight=:flightno;
    请根据上述描述,完成下列问题。
上述售票程序,在并发状态下,可能发生什么错误?产生这种错误的原因是什么?

选项

答案当两个用户同时购买同一航班的机票时,可能发生丢失修改的错误,即一个用户购票后对剩余票数的修改被另一个用户的修改覆盖,第一个用户的修改并未体现到数据库中。产生错误的原因是并发操作破坏了事务的隔离性。

解析 本题考查事务基本概念及编程应用。
    此类题目要求考生认真阅读题目对实际问题的描述,分析现实业务中存在的问题,并以事务的方式提出解决方案及编程中的处理方式。
根据题目描述的售票程序及部分代码,程序的逻辑是正确的,但在并发状态下,可能会产生错误。修改指令UPDATE会被分解为读取剩余票数到变量、修改变量、写入数据库几个步骤,并发时存在指令交叉,造成一个程序的修改被其他程序所覆盖,称为丢失修改错误。如下面所示的一个并发调度:

    若上面所示的两个售票程序并发执行,两个程序先读取剩余票数据A(当前值为16)T1购票1张后,写入剩余票数为15,T2购票2张后,写入剩余票数为14。T1写入的15被T2写入的14所覆盖,T1所做的修改丢失。
    上述两个程序单独执行或串行执行都不会出现这种错误,错误产生的原因在于事务并发执行时受到另一事务的干扰,破坏了事务的隔离性。
转载请注明原文地址:https://jikaoti.com/ti/lwN7FFFM
0

相关试题推荐
最新回复(0)