事务处理及封锁机制在毕业论文选题系统中的应用
2014-04-10陈少平何光源
王 攀,陈少平,谷 涛,何光源
(1.华中科技大学 生命科学与技术学院 科技部基因工程国际合作基地 教育部分子生物物理重点实验室,湖北 武汉 430074;2.中南民族大学 电子信息工程学院,湖北 武汉 430074)
随着各种网络技术、数据库技术的日益成熟和普及,依托校园网开发基于Web的管理信息系统,使相关的人力、物力、财力得到很好的管理和运作,已经成为国内各高校本科教学管理的发展方向[1-3]。本文讨论的毕业论文选题系统正是在这一背景下提出的。它构建于Internet之上,集中管理本科毕业论文选题过程中学生和教师之间的双向选择。
1 问题的提出与分析
在传统的毕业论文双向选题中,学生对教师发布论文题目的选择和教师对学生的选择一般依次、轮流地进行。首先,学生预选自己感兴趣的论文题目,然后,教师确定是否对该学生进行正选。如果一轮过后仍有学生未被正选,则将进入下一轮。这种选择方式的师生互动性较弱,很容易出现某一教师的题目被选过多,而某一学生几轮过后仍然未被正选的情况。
为了改变上述状况,毕业论文选题系统的开发必须注重信息的并发控制,实现师生双向选择的并发进行和相互制约。首先规定基本选题原则:
(1)一个教师可以发布多个题目,一个题目可由多个学生参与;
(2)学生可以预选多个题目(教务管理员设置学生可预选题目数量的上限),已预选的题目也可以退选;
(3)教师可以正选多个预选了本人发布题目的学生(教务管理员设置教师可正选学生总人数的上限);
(4)题目相应的正选学生人数不能超过其限参与人数(主要由教师事先设定);
(5)教师正选学生后,该学生已预选的其他题目将被自动退选,且该学生不能再进行预选或退选操作。
通过上述原则对师生并发互动的双向选题过程加以控制。如果学生发现本人预选的题目已被选满,可及时改选其他题目;教师也可根据选题情况,及时对本人发布的题目进行完善与改进,从而调动了师生参与的积极性。然而,需要避免用户并发操作的相互干扰而破坏系统的数据一致性。
例如,当前教师T1发布的题目t1已经被学生S1预选,之后将执行“T1针对t1正选S1”的操作A1和“S1退选t1”的操作A2。A1和A2执行过程中都会先进行“确认S1预选了t1且没有被正选”的查询步骤,再根据情况确定是否进行正选或退选。如果A1和A2串行执行,结果必然一个成功一个失败。如果是交错并发执行,则A1和A2都可能执行成功,从而产生数据不一致现象。
除了并发操作之间的相互干扰,在更新数据的过程中因系统故障(如服务器死机、停电等)而出现异常中断也会造成数据不一致。
2 系统的总体设计
系统开发基于B/S(浏览器/服务器)结构[4],采用Apache作为Web服务器,操作系统为Linux,所有的Web应用程序基于跨平台脚本编程语言PHP进行开发,选用关系型数据库管理系统MySQL作为数据库服务器[5]。
选题过程涉及的主要数据表及其主要字段如下:
(1)教师表(工号、限正选学生数、已正选学生数);
(2)学生表(学号、限预选题目数、已预选题目数、正选教师工号、正选题目编号);
(3)题目表(编号、名称、备注、发布教师工号、限参与学生数、已预选学生数、已正选学生数、研究类别);
(4)预选表(学号、题目编号)。
系统提供了教师发布、修改和删除题目信息,学生预选或退选题目,教师正选学生,用户浏览题目,教务管理员对已被正选学生的退选(教师不能直接退选),教务管理员对互选状况的统计等功能模块。对于学生和教师的操作,严格按照前文第1节提到的“基本选题原则”进行限制。
3 事务处理及封锁机制的应用与探讨
3.1 数据一致性的保证
目前主流关系型数据库管理系统支持事务处理及封锁机制[6](对于 MySQL而言,需选择InnoDB存储引擎[7]),为数据一致性问题提供了有效解决途径。
事务处理机制能够将一组逻辑上相关且连续的数据库操作系列组建成一个事务,在事务执行期间如果因系统故障而出现异常中断,数据库能自动恢复到事务开始前的状态,从而避免了此类异常中断造成的数据不一致。
但是,对于因并发操作干扰而产生的数据不一致,还需进一步采用并发控制理论中的三级封锁协议[6]。三级封锁协议要求事务在修改数据之前必须申请对该数据加排他锁,使其他事务对该数据不能读取也不能修改;在读取数据之前必须申请对该数据加共享锁,使其他事务对该数据只能读取但不能修改。如果事务因申请加锁的数据已被其他事务加锁而暂时申请不成功(即“锁冲突”),则需等待其他事务释放锁;如果事务申请加锁成功,直到其结束才释放锁。通常情况下,该协议能够使事务对数据对象的修改或读取在数据一致性方面不会受到其他事务的干扰。
除了利用上述机制,保证系统数据一致性还要注意以下问题。
(1)有时有必要允许一个或多个数据表中存在信息冗余,以提高查询效率,但也会因此带来数据不一致的隐患。为此,只要对所涉及冗余信息相关的数据同步更新,就可以避免信息冗余造成的数据不一致。
(2)在数据一致性问题上,除了不同身份用户并发操作(例如针对同一题目的教师正选和学生退选)、相同身份的不同用户并发操作(例如针对同一学生的不同教师的正选)的相互干扰,还需防止同一用户名重复登录后并发操作可能产生的干扰。
(3)要对死锁和锁等待超时加以控制。
3.2 系统并发性的兼顾
虽然采用事务处理及封锁机制能够保证数据一致性,但也会导致部分事务“锁冲突”而使系统并发性降低,进而对系统性能造成影响[8]。这种影响在并发访问量较大时会表现得十分显著。
有2个原因导致了本系统会经常面临高并发访问情况:(1)本科毕业论文选题时间比较集中,甚至几个院系会同时进行;(2)由于系统已经整合到使用范围更大的实验教学管理系统中,经常会同时进行其他高并发访问的教务活动(如针对实验室或实验课堂的特定时段的开放预约)。
实际上,在数据库设计、应用程序设计、运行环境配置等系统开发的各个环节中,可以采取多种优化措施来兼顾系统并发性[8-9]。本文主要从减少“锁冲突”的角度做进一步探讨。
(1)利用MySQL的InnoDB存储引擎支持的“行级锁”[7]。只要对数据表建立索引,就可以通过索引对数据表中部分记录加锁,从而使涉及不同记录的事务在并发执行中不会出现“锁冲突”。
(2)利用信息冗余,减少执行频度较高的查询语句封锁对象的数目。例如题目表中的冗余信息“已正选学生数”可以使用户查询所有题目正选状况时不会封锁学生表中的记录,但教师正选学生时必须同时封锁并更新题目表和学生表中的记录。相对而言,“查询题目正选状况”的执行频度比“教师正选学生”高得多,因而该信息冗余的设计非常有必要。
(3)与多数信息管理系统相似,本系统对查询操作的数据一致性要求不高,不将其组建成事务,以减少其同时封锁对象的数目。例如,教师在正选操作时可能发现某一题目“预选学生人数”比列出的“预选学生名单”多或少1个人,这是因为在查询题目表和预选表之间某一学生进行了退选或预选操作,但这不会影响系统的数据一致性。
(4)对于非访问数据库的、执行较慢的程序语句,尽量放在事务加锁语句之前,以缩短封锁时间。例如,教师修改已经发布的题目信息,可以将任务书上传并存放为临时文件(较慢)之后再进入事务,而事务内部则根据数据库更新是否成功,将该临时文件替换掉原文件或删除(较快)。
(5)实时性要求不高、封锁对象较多的批处理操作尽量避免在并发访问量较大时执行。例如,教务管理员希望每天对所有题目的互选状况按照研究类别、所属教师教研室等进行批量统计。为此,系统采取了一种基于Agent(智能代理)程序[10]的批处理操作方式,即在并发访问量较大时,仅将批处理的指令提交到数据表中,并置为“待执行”状态;Agent程序定期自动检测系统并发状况和该数据表,在并发访问量较小时自动完成其中“待执行”状态的指令,并修改其状态;教务管理员下次登录后可以查看这些指令的执行状态。
(6)要避免死锁。
3.3 死锁和锁等待超时等事务故障的控制
多个并发事务已经分别封锁了数据对象,同时每个事务都在请求对其他事务已封锁数据对象的加锁,形成循环“锁冲突”现象,即死锁。
在本系统中,假设当前学生S1和S2都可预选3个题目,且S1已预选教师T1发布的题目t1和教师T2发布的题目t2,教师T3发布了题目t3,之后可能发生死锁的情况列举如下。
(1)“S2预选t1”的事务B1和“T1针对t1正选S1”的事务B2并发执行。B1和B2都需要封锁题目表t1记录以确认t1未被选满、封锁教师表T1记录以确认T1未被选满,如果B1先封锁题目表t1记录,B2再封锁教师表T1记录,之后B1和B2都将试图封锁对方已封锁的记录,则产生死锁。
(2)“T1针对t1正选S1”的事务C1和“T2针对t2正选S1”的事务C2并发执行。C1和C2都需要封锁题目表中的t1和t2记录并修改其已正选或预选学生数,如果C1先封锁并修改t1记录,C2再封锁并修改t2记录,之后C1和C2都将试图封锁对方已封锁的记录,则产生死锁。
(3)“S1预选t3”的事务 D1和“S2预选t3”的事务D2并发执行。按照三级封锁协议,D1和D2先后都可成功对题目表中t3记录加共享锁,以确认t3未被选满,之后它们都将试图对该t3记录加排他锁以修改t3的已预选学生数,则产生死锁。
MySQL的InnoDB存储引擎一般能自动检测到死锁的发生,使其中一个事务释放锁并回退到起始状态,而另一个事务获得锁并继续运行。然而,如果不加以控制,死锁会产生以下问题。
(1)被回退的事务并没有被撤销,回退点之前的SQL语句也不会再被执行。由于网站PHP程序以嵌入方式使用SQL语句访问MySQL,被回退的事务还会继续执行回退点之后的SQL语句,从而可能会破坏系统的数据一致性。
(2)死锁是“锁冲突”的特殊形式,由于还受到回退等因素的影响,往往会使系统并发性进一步降低[8]。
除了死锁,锁等待超时也是并发操作可能导致的事务故障,其主要是指由于并发访问量较大等原因,发生“锁冲突”而被迫等待的事务等待时间过长(默认值为50秒),则系统将取消该事务中相应的加锁语句的执行。与死锁情况类似,由于该加锁语句之后的SQL语句还能够继续被执行,从而可能造成数据不一致。针对这些事务故障,本系统主要采取了以下措施:
(1)预先对系统中的所有数据表进行排序,对每个数据表中的记录则按主码进行排序,而所有事务对其所涉及的数据表或记录,只能按照预设顺序申请加锁。该措施可避免与上文列举的死锁情况(1)和(2)类似的情况。
(2)如果事务对某记录查询之后还要再修改,则在查询之前一次性对该记录申请加排他锁。该措施可避免与上文列举的死锁情况(3)类似的情况。
(3)针对事务中所有的加锁语句,能够捕捉到死锁和锁等待超时等造成的异常,并且在该异常发生时撤销整个事务,给出“系统忙”的提示并返回之前的操作界面。该措施能防止锁等待超时、由于系统改进等原因还未设法避免的死锁等可能造成的数据不一致。
4 结束语
本文所介绍的毕业论文选题系统于2009年9月整合到中南民族大学实验教学与实验室开放管理系统[11-12](http://labsystem.scuec.edu.cn)中,已在 该校计算机科学学院、化学与材料科学学院、外语学院、经济学院等院系正常使用了4年,平均每学年完成约5 800名学生、990名教师的毕业论文选题。由于本科毕业论文参与人数多、协作性强,在该系统中引入事务处理及封锁机制,可以增强师生双向选题的互动性,充分调动师生参与选题乃至整个毕业论文教学的积极性,进而对毕业论文教学的顺利实施和毕业论文水平的提高起到很好的促进作用。
(
)
[1]付小龙,宣华,袁芳,等.新一代综合教务管理系统技术体系的设计与实现[J].实验技术与管理,2011,28(4):95-100.
[2]王利江.基于完全学分制教务管理系统的改进和完善[J].内蒙古师范大学学报:教育科学版,2012,25(3):91-93.
[3]宣华,郭大勇,罗念龙.依托信息技术的高校现代化教学支撑平台[J].清华大学学报:自然科学版,2009,49(8):1245-1248.
[4]许龙飞,李国和,马玉书.Web数据库技术与应用[M].北京:科学出版社,2005.
[5]刘乃琦,李忠.PHP和MySQL Web应用开发[M].北京:人民邮电出版社,2013.
[6]萨师煊,王珊.数据库系统概论[M].3版.北京:高等教育出版社,2000.
[7]唐汉明,翟振兴,兰丽华,等.深入浅出MySQL数据库开发、优化与管理维护[M].北京:人民邮电出版社,2008.
[8]牛新庄.DB2数据库性能调整和优化[M].北京:清华大学出版社,2009.
[9]李军.高并发 Web系统的设计与优化[D].北京:北京交通大学,2009.
[10]王攀,鲁强,曾绍群,等.基于 Web信息自动获取构建生物信息二级数据库[J].高技术通讯,2004,14(5):28-31.
[11]王攀,陈少平,王晶,等.基于 Web的实验室开放管理系统的设计与实现[J].现代教育技术,2008,18(10):101-104.
[12]王攀,王晶,陈少平.基于Web的实验教学管理系统的设计与实现[J].中国电化教育,2010(2):115-118.