第九章答案
1.请简单描述事务的必要性。 答:请参看9.1.1章节内容。
2.关闭MySQL自动提交的方法有哪些?您推荐数据库开发人员使用哪一种方法? 答:请参看9.1.2章节内容。推荐数据库开发人员尽可能地使用MySQL命令“start transaction;”隐式地关闭自动提交,使用MySQL命令“commit;”显示地提交更新语句。
3.关闭MySQL自动提交后,提交更新语句的方法有哪些?您推荐数据库开发人员使用哪一种方法?
答:请参看9.1.4章节内容。推荐数据库开发人员尽可能地使用MySQL命令“start transaction;”隐式地关闭自动提交,使用MySQL命令“commit;”显示地提交更新语句。
4.请简单描述典型的事务处理使用方法。 答:请参看9.1.5章节内容。
5.请简单描述典型的事务保存点使用方法。您是如何理解保存点是“临时状态”这句话的?
答:请参看9.1.6章节内容。 6.请简单描述锁机制的必要性。 答:请参看9.2.1章节内容。
7.为MyISAM表施加表级锁的语法格式是什么? 答:请参看9.2.3章节内容。
8.为MyISAM表施加表级锁时,read local与read选项有什么区别? 答:请参看9.2.3章节内容。
9.您是如何理解锁的粒度、隐式锁与显式锁、锁的类型、锁的钥匙以及锁的生命周期等概念的?
答:请参看9.2.2章节内容。
10.您如何理解锁的粒度、锁的生命周期与数据库的并发性能之间的关系?
答:锁的粒度越小,锁的生命周期越短,数据库的并发性能就越高,数据库越适合做并发更新操作。反之亦然。
11.您如何理解锁的粒度、锁的生命周期与服务器资源之间的关系?
答:锁粒度越小,完成某个功能时所需要的加锁、解锁的次数就会越多,反而会消耗较多的服务器资源,甚至会出现资源的恶性竞争,甚至发生死锁问题。锁是数据库管理系统重要的数据库资源,需要耗费一定的服务器内存,锁的生命周期越长,该锁占用服务器内存的时间间隔就越长;锁的生命周期越短,该锁占用服务器内存的时间间隔就越短。因此为了节省服务器资源,数据库开发人员必须尽可能的缩短锁的生命周期,尽可能早地释放锁资源。
12.“选课系统”应该使用哪种粒度的锁机制?为什么?
答:对于“选课系统”而言,系统需要为上百名学生,甚至几百名学生同时提供选课、调课、退课服务。为了提高并发性能,“选课系统”将选用行级锁,这也是“选课系统”的各个数据库表使用InnoDB存储引擎的原因。
13.为InnoDB表施加行级锁的语法格式是什么? 答:请参看9.2.4章节内容。
14.请列举现实生活中的“资源竞争”问题,如何使用锁机制解决此类“资源竞争”问题?
答:现实生活中,选课系统就存在“资源竞争”问题,解决方案请参看9.2.5章节内容。 15.完成调课功能的replace_course_proc()存储过程以及完成选课功能choose_proc()存储过程使用了行级锁解决了“资源竞争”问题,能不能将存储过程中下面的select语句写在“start transaction;”语句之前,以便缩短行级锁的生命周期?
说明:题目中的“select state into status from course where course_no=c_no”应该修改为 “select available into s3 from course where course_no=c_no for update” 答:select available into s3 from course where course_no=c_no for update
必须放在“start transaction;”语句之后,目的是:延长行级排他锁的生命周期,所以需要将该select语句写在了start transaction语句后,封装到事务中。
16.InnoDB什么时候使用间隙锁,什么时候使用记录锁?间隙锁与记录锁之间的区别是什么?
答: 当事务的隔离级别设置为repeatable read,此时为InnoDB表施加行级锁,默认情况下使用间隙锁。当事务的隔离级别设置为read uncommitted或者read committed,此时为InnoDB表施加行级锁,默认情况下使用记录锁(record lock)。
间隙锁(next-key锁):当检索条件为某个区间(例如account_no between 1 and 100)范围时,对该区间范围施加共享锁或排他锁后,满足该区间范围的记录(例如account_no=1或者account_no=2的记录)存在共享锁或排他锁;满足该区间范围,但表中不存在的记录(例如account_no=50或者account_no=100的记录)也会存在共享锁或排他锁,即行级锁会锁定相邻的键(next-key locking)。
记录锁:与间隙锁不同,记录锁仅仅为满足该查询范围的记录施加共享锁或排他锁。
17.锁等待与死锁之间是什么关系? 答:请参看9.2.9章节内容。 18.请解释事务的ACID特性。 答:请参看9.3.1章节内容。
19.MySQL支持哪些事务隔离级别?默认的事务隔离级别是什么? 答:请参看9.3.2章节内容。
20.每一种事务隔离级别可能引发什么问题? 答:脏读、不可重复读、幻读、死锁等问题。
21.脏读现象、不可重复读现象以及幻读现象之间有什么区别? 答:请参看9.3.2章节内容。
22.您如何理解事务、锁机制、事务的隔离级别之间的关系? 答:请参看9.4章节内容。
select state into status from course where course_no=c_no;
第十章答案
1.选用PHP脚本语言开发网上选课系统的原因是什么? 答:请参看10.1.1章节内容。
2.请简单描述PHP脚本程序的工作流程。 答:请参看10.1.3章节内容。
3.什么是软件开发生命周期?对于一个真实的软件项目而言,您觉得编码阶段是软件开发生命周期中最难实现的环节吗?
答:请参看10.2章节内容。对于一个真实的软件项目而言,编码阶段仅仅是软件开发生命周期中的其中一个环节,并不是最难实现的环节,俗话说,万事开头难,一般而言,最难实现的环节一般是系统规划和系统分析阶段。
4.请简单描述网上选课系统的目标、可行性分析、项目进度、人员分工。 答:请参看10.3章节内容。
5.请简单描述网上选课系统的功能需求分析与非功能需求分析。 答:请参看10.4章节内容。
6.请简单描述网上选课系统的系统设计。 答:请参看10.5章节内容。
7.按照本章要求、步骤实现网上选课系统。 答:请参看本章代码部分内容。
8.根据本章的知识,参看视图与触发器章节的内容,为网上选课系统添加两个新的功能模块:重置所有学生的密码,重置所有教师的密码。
答:代码略。
9.根据本章的知识,为网上选课系统添加新的功能模块:任课教师编辑未经审核的课程信息。
答:代码略。
10.什么是MVC模式,使用MVC模式开发程序有哪些优点? 答:请参看10.7章节内容。
11.编写功能测试用例,测试网上选课系统其他功能模块。 答:请参看10.8章节内容。