参考答案:
【问题1】
问题:出现丢失更新,如:当票数为1的时候,可能将同一机票订给多个用户等现象。
原因:破坏了事务的隔离性。
【问题2】
执行效率低
一个事务查询需要多次通过网络进行查询;其中还需要等待人机交互,导致一个事务执行的时间长,从而导致并发性能差。
事物划分不合理
将事物适当划分,查询至于外部事物,该事物只负责购票。
【问题3】
(a)INT a IN
(b)balance-a
(c)ROLLBACK
(d)result=1;return;
详细解析:
本题考查事务基本概念及编程应用。
此类题目要求考生认真阅读题目对实际问题的描述,分析现实业务中存在的问题,并以事务的方式提出解决方案及编程中的处理方式。【问题 1】
根据题目描述的售票程序及部分代码,程序的逻辑是正确的,但在并发状态下,可能会产生错误。修改指令 UPDATE 会被分解为读取剩余票数到变量、修改变量、写入数据库几个步骤,并发时存在指令交叉,造成一个程序的修改被其他程序所覆盖,称为丢失修改错误。如下面所示的一个并发调度:

若上面所示的两个售票程序并发执行,两个程序先读取剩余票数据 A( 当前值为 16)T1购票1张后,写入剩余票数为 15,T2 购票 2 张后,写入剩余票数为 14。T1写入的 15被T2写入的 14 所覆盖,T1所做的修改丢失。
上述两个程序单独执行或串行执行都不会出现这种错误,错误产生的原因在于事务并发执行时受到另一事务的干扰,破坏了事务的隔离性。
【问题 2】
封装的事务由两条 SQL 语句构成,中间存在与用户的交互,等待用户输入购票张数, 会造成长事务,加锁状态下,其他购票事务程序会长时间等待,严重影响系统的响应速度。
应将查询票数从事务中分离出来,UPDATE 指令独立构成一个事务 。
【问题3】
这是一个用存储过程实现购票的事务程序,存储过程参数部分给出了航班号和执行状态返回参数,应加入购票张数作为参数:修改剩余票数的 UPDATE语句处需补充的是当前票数减去购票张数;; SQL 语句执行错误时应该进行事务回滚并退出程序,所有事务代码执行完成后提交,并返回。