参考答案:
(1)数据冗余:如果某代理商代理100个航班的售票,那么在机票代理的关系模式中就要出现100个元组,该代理商的名称、客服电话也随之重复出现100次。
(2)修改异常:由于上述冗余问题,当需要修改该代理商的客服电话时,就要修改100个元组中的客服电话值,否则就会出现客服电话值不一致的现象。
2)解决存储异常的典型方案是进行模式分解,但在本题中机票代理已是逆规范化的产物,故可使用触发器在修改时,检查并更新对应数据的方式来解决数据不一致的问题。
【问题2】
1)2个代理商都成功售出1张票,剩余票数为0。
2)数据库的并发操作会带来一些数据不一致问题,例如,丢失修改、读脏数据和不可重复读等。
(1)丢失修改。事务A与事务B从数据库中读入同一数据并修改,事务B的提交结果破坏了事务A提交的结果,导致事务A的修改被丢失。
(2)读脏数据。事务A修改某一数据,并将其写回磁盘,事务B读取同一数据后,事务A由于某种原因被撤消,这时事务A已修改过的数据恢复原值,事务B读到的数据就与数据库中的数据不一致,是不正确的数据。
(3)不可重复读。事务A读取数据后,事务B执行了更新操作,事务A使用的仍是更新前的值,造成了数据不一致性。
【问题3】
(1)加写锁
(2)加读锁
(3)加写锁
(4)等待
(5)得到通知
(6)加写锁
采用封锁的方法虽然可以有效防止数据的不一致性,但封锁本身也会产生一些麻烦,最主要就是死锁问题。也就是说,多个事务申请不同封锁,由于申请者均拥有一部分封锁权,而又需等待另外事务拥有的部分封锁而引起的永无休止的等待。
详细解析:
本问题考查数据库设计中关系范式规范化和反规范化的相关知识。众所周知,关系范式规范化的结果是关系越来越小,关系范式的概念越单一。但是要解答用户的问题,往往会涉及到多表关联操作,影响查询效率。因此应用中经常采用反规范化的方法来提高查询效率。因此开发小组对机票代理关系模式的修改属于反规范化。
但是反规划带来的直接结果是数据冗余存放,如题干描述的机票代理中,代理商名称和客服电话数据就存在于机票代理和代理商两个模式中。这种情况会引起更新异常,比如当代理商名称或客服电话变更时,不仅需要修改代理商关系模式,还需要修改机票代理关系模式,否则会造成数据不一致。
要解决范式规范化带来的问题,主要是保持两个地方存储数据的一致性。常见的方法有两种:一种是通过程序实现,在业务程序中,当修改代理商关系模式数据时,程序同步修改机票代理关系模式;另一种是通过触发器实现,在代理商关系模式上加修改触发器,当修改代理商关系模式数据时,程序同步修改机票代理关系模式。
【问题2】
本问题考查数据库设计中的并发问题和数据库事务隔离级别的基本概念。数据库为众多用户同时提供服务,如果多个用户产生了对同一个数据的并发读取操作,就会产生并发问题。
表4-1描述的是并发的一种可能情况,在允许脏读的条件下,第一个代理商能够正确售票。第二个代理商查询剩余票数时正确,为1张机票,但剩余票数减一操作时出错,因为该机票已经被第一个代理商售出,此时第二个代理商无票可售。
并发问题会造成数据的不一致。在数据库事务隔离级别定义中,定义了并发问题会造成的三种现象,分别是丢失修改、读脏数据和不可重复读,而根据这三种现象,划分了4种不同的事务隔离级别。
【问题3】
本问题考查数据库中基本的读写锁机制,通过提供读锁和写锁的相互阻塞,来解决并发问题。锁机制的基本概念是读取操作之前先加锁,成功后方能读写数据。读操作加读锁,写操作加写锁。读锁会阻塞写锁,即加了读锁的数据,在未释放读锁之前不能加写锁,可以加读锁;同样,写锁会阻塞读锁,在写锁未释放前,不能再加读锁和写锁。其实质是使得相互冲突的并发读写操作,变为串行化读写操作,来解决并发问题。
因此,根据读写锁的基本机制,表4-2中的空应该填写的内容是(1)加写锁、(2)加读锁、(3)加写锁、(4)被阻塞、(5)得到通知、(6)加写锁。