王 攀,陳少平,谷 濤,何光源
(1.華中科技大學(xué) 生命科學(xué)與技術(shù)學(xué)院 科技部基因工程國(guó)際合作基地 教育部分子生物物理重點(diǎn)實(shí)驗(yàn)室,湖北 武漢 430074;2.中南民族大學(xué) 電子信息工程學(xué)院,湖北 武漢 430074)
隨著各種網(wǎng)絡(luò)技術(shù)、數(shù)據(jù)庫(kù)技術(shù)的日益成熟和普及,依托校園網(wǎng)開(kāi)發(fā)基于Web的管理信息系統(tǒng),使相關(guān)的人力、物力、財(cái)力得到很好的管理和運(yùn)作,已經(jīng)成為國(guó)內(nèi)各高校本科教學(xué)管理的發(fā)展方向[1-3]。本文討論的畢業(yè)論文選題系統(tǒng)正是在這一背景下提出的。它構(gòu)建于Internet之上,集中管理本科畢業(yè)論文選題過(guò)程中學(xué)生和教師之間的雙向選擇。
在傳統(tǒng)的畢業(yè)論文雙向選題中,學(xué)生對(duì)教師發(fā)布論文題目的選擇和教師對(duì)學(xué)生的選擇一般依次、輪流地進(jìn)行。首先,學(xué)生預(yù)選自己感興趣的論文題目,然后,教師確定是否對(duì)該學(xué)生進(jìn)行正選。如果一輪過(guò)后仍有學(xué)生未被正選,則將進(jìn)入下一輪。這種選擇方式的師生互動(dòng)性較弱,很容易出現(xiàn)某一教師的題目被選過(guò)多,而某一學(xué)生幾輪過(guò)后仍然未被正選的情況。
為了改變上述狀況,畢業(yè)論文選題系統(tǒng)的開(kāi)發(fā)必須注重信息的并發(fā)控制,實(shí)現(xiàn)師生雙向選擇的并發(fā)進(jìn)行和相互制約。首先規(guī)定基本選題原則:
(1)一個(gè)教師可以發(fā)布多個(gè)題目,一個(gè)題目可由多個(gè)學(xué)生參與;
(2)學(xué)生可以預(yù)選多個(gè)題目(教務(wù)管理員設(shè)置學(xué)生可預(yù)選題目數(shù)量的上限),已預(yù)選的題目也可以退選;
(3)教師可以正選多個(gè)預(yù)選了本人發(fā)布題目的學(xué)生(教務(wù)管理員設(shè)置教師可正選學(xué)生總?cè)藬?shù)的上限);
(4)題目相應(yīng)的正選學(xué)生人數(shù)不能超過(guò)其限參與人數(shù)(主要由教師事先設(shè)定);
(5)教師正選學(xué)生后,該學(xué)生已預(yù)選的其他題目將被自動(dòng)退選,且該學(xué)生不能再進(jìn)行預(yù)選或退選操作。
通過(guò)上述原則對(duì)師生并發(fā)互動(dòng)的雙向選題過(guò)程加以控制。如果學(xué)生發(fā)現(xiàn)本人預(yù)選的題目已被選滿,可及時(shí)改選其他題目;教師也可根據(jù)選題情況,及時(shí)對(duì)本人發(fā)布的題目進(jìn)行完善與改進(jìn),從而調(diào)動(dòng)了師生參與的積極性。然而,需要避免用戶并發(fā)操作的相互干擾而破壞系統(tǒng)的數(shù)據(jù)一致性。
例如,當(dāng)前教師T1發(fā)布的題目t1已經(jīng)被學(xué)生S1預(yù)選,之后將執(zhí)行“T1針對(duì)t1正選S1”的操作A1和“S1退選t1”的操作A2。A1和A2執(zhí)行過(guò)程中都會(huì)先進(jìn)行“確認(rèn)S1預(yù)選了t1且沒(méi)有被正選”的查詢步驟,再根據(jù)情況確定是否進(jìn)行正選或退選。如果A1和A2串行執(zhí)行,結(jié)果必然一個(gè)成功一個(gè)失敗。如果是交錯(cuò)并發(fā)執(zhí)行,則A1和A2都可能執(zhí)行成功,從而產(chǎn)生數(shù)據(jù)不一致現(xiàn)象。
除了并發(fā)操作之間的相互干擾,在更新數(shù)據(jù)的過(guò)程中因系統(tǒng)故障(如服務(wù)器死機(jī)、停電等)而出現(xiàn)異常中斷也會(huì)造成數(shù)據(jù)不一致。
系統(tǒng)開(kāi)發(fā)基于B/S(瀏覽器/服務(wù)器)結(jié)構(gòu)[4],采用Apache作為Web服務(wù)器,操作系統(tǒng)為L(zhǎng)inux,所有的Web應(yīng)用程序基于跨平臺(tái)腳本編程語(yǔ)言PHP進(jìn)行開(kāi)發(fā),選用關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)MySQL作為數(shù)據(jù)庫(kù)服務(wù)器[5]。
選題過(guò)程涉及的主要數(shù)據(jù)表及其主要字段如下:
(1)教師表(工號(hào)、限正選學(xué)生數(shù)、已正選學(xué)生數(shù));
(2)學(xué)生表(學(xué)號(hào)、限預(yù)選題目數(shù)、已預(yù)選題目數(shù)、正選教師工號(hào)、正選題目編號(hào));
(3)題目表(編號(hào)、名稱、備注、發(fā)布教師工號(hào)、限參與學(xué)生數(shù)、已預(yù)選學(xué)生數(shù)、已正選學(xué)生數(shù)、研究類別);
(4)預(yù)選表(學(xué)號(hào)、題目編號(hào))。
系統(tǒng)提供了教師發(fā)布、修改和刪除題目信息,學(xué)生預(yù)選或退選題目,教師正選學(xué)生,用戶瀏覽題目,教務(wù)管理員對(duì)已被正選學(xué)生的退選(教師不能直接退選),教務(wù)管理員對(duì)互選狀況的統(tǒng)計(jì)等功能模塊。對(duì)于學(xué)生和教師的操作,嚴(yán)格按照前文第1節(jié)提到的“基本選題原則”進(jìn)行限制。
目前主流關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)支持事務(wù)處理及封鎖機(jī)制[6](對(duì)于 MySQL而言,需選擇InnoDB存儲(chǔ)引擎[7]),為數(shù)據(jù)一致性問(wèn)題提供了有效解決途徑。
事務(wù)處理機(jī)制能夠?qū)⒁唤M邏輯上相關(guān)且連續(xù)的數(shù)據(jù)庫(kù)操作系列組建成一個(gè)事務(wù),在事務(wù)執(zhí)行期間如果因系統(tǒng)故障而出現(xiàn)異常中斷,數(shù)據(jù)庫(kù)能自動(dòng)恢復(fù)到事務(wù)開(kāi)始前的狀態(tài),從而避免了此類異常中斷造成的數(shù)據(jù)不一致。
但是,對(duì)于因并發(fā)操作干擾而產(chǎn)生的數(shù)據(jù)不一致,還需進(jìn)一步采用并發(fā)控制理論中的三級(jí)封鎖協(xié)議[6]。三級(jí)封鎖協(xié)議要求事務(wù)在修改數(shù)據(jù)之前必須申請(qǐng)對(duì)該數(shù)據(jù)加排他鎖,使其他事務(wù)對(duì)該數(shù)據(jù)不能讀取也不能修改;在讀取數(shù)據(jù)之前必須申請(qǐng)對(duì)該數(shù)據(jù)加共享鎖,使其他事務(wù)對(duì)該數(shù)據(jù)只能讀取但不能修改。如果事務(wù)因申請(qǐng)加鎖的數(shù)據(jù)已被其他事務(wù)加鎖而暫時(shí)申請(qǐng)不成功(即“鎖沖突”),則需等待其他事務(wù)釋放鎖;如果事務(wù)申請(qǐng)加鎖成功,直到其結(jié)束才釋放鎖。通常情況下,該協(xié)議能夠使事務(wù)對(duì)數(shù)據(jù)對(duì)象的修改或讀取在數(shù)據(jù)一致性方面不會(huì)受到其他事務(wù)的干擾。
除了利用上述機(jī)制,保證系統(tǒng)數(shù)據(jù)一致性還要注意以下問(wèn)題。
(1)有時(shí)有必要允許一個(gè)或多個(gè)數(shù)據(jù)表中存在信息冗余,以提高查詢效率,但也會(huì)因此帶來(lái)數(shù)據(jù)不一致的隱患。為此,只要對(duì)所涉及冗余信息相關(guān)的數(shù)據(jù)同步更新,就可以避免信息冗余造成的數(shù)據(jù)不一致。
(2)在數(shù)據(jù)一致性問(wèn)題上,除了不同身份用戶并發(fā)操作(例如針對(duì)同一題目的教師正選和學(xué)生退選)、相同身份的不同用戶并發(fā)操作(例如針對(duì)同一學(xué)生的不同教師的正選)的相互干擾,還需防止同一用戶名重復(fù)登錄后并發(fā)操作可能產(chǎn)生的干擾。
(3)要對(duì)死鎖和鎖等待超時(shí)加以控制。
雖然采用事務(wù)處理及封鎖機(jī)制能夠保證數(shù)據(jù)一致性,但也會(huì)導(dǎo)致部分事務(wù)“鎖沖突”而使系統(tǒng)并發(fā)性降低,進(jìn)而對(duì)系統(tǒng)性能造成影響[8]。這種影響在并發(fā)訪問(wèn)量較大時(shí)會(huì)表現(xiàn)得十分顯著。
有2個(gè)原因?qū)е铝吮鞠到y(tǒng)會(huì)經(jīng)常面臨高并發(fā)訪問(wèn)情況:(1)本科畢業(yè)論文選題時(shí)間比較集中,甚至幾個(gè)院系會(huì)同時(shí)進(jìn)行;(2)由于系統(tǒng)已經(jīng)整合到使用范圍更大的實(shí)驗(yàn)教學(xué)管理系統(tǒng)中,經(jīng)常會(huì)同時(shí)進(jìn)行其他高并發(fā)訪問(wèn)的教務(wù)活動(dòng)(如針對(duì)實(shí)驗(yàn)室或?qū)嶒?yàn)課堂的特定時(shí)段的開(kāi)放預(yù)約)。
實(shí)際上,在數(shù)據(jù)庫(kù)設(shè)計(jì)、應(yīng)用程序設(shè)計(jì)、運(yùn)行環(huán)境配置等系統(tǒng)開(kāi)發(fā)的各個(gè)環(huán)節(jié)中,可以采取多種優(yōu)化措施來(lái)兼顧系統(tǒng)并發(fā)性[8-9]。本文主要從減少“鎖沖突”的角度做進(jìn)一步探討。
(1)利用MySQL的InnoDB存儲(chǔ)引擎支持的“行級(jí)鎖”[7]。只要對(duì)數(shù)據(jù)表建立索引,就可以通過(guò)索引對(duì)數(shù)據(jù)表中部分記錄加鎖,從而使涉及不同記錄的事務(wù)在并發(fā)執(zhí)行中不會(huì)出現(xiàn)“鎖沖突”。
(2)利用信息冗余,減少執(zhí)行頻度較高的查詢語(yǔ)句封鎖對(duì)象的數(shù)目。例如題目表中的冗余信息“已正選學(xué)生數(shù)”可以使用戶查詢所有題目正選狀況時(shí)不會(huì)封鎖學(xué)生表中的記錄,但教師正選學(xué)生時(shí)必須同時(shí)封鎖并更新題目表和學(xué)生表中的記錄。相對(duì)而言,“查詢題目正選狀況”的執(zhí)行頻度比“教師正選學(xué)生”高得多,因而該信息冗余的設(shè)計(jì)非常有必要。
(3)與多數(shù)信息管理系統(tǒng)相似,本系統(tǒng)對(duì)查詢操作的數(shù)據(jù)一致性要求不高,不將其組建成事務(wù),以減少其同時(shí)封鎖對(duì)象的數(shù)目。例如,教師在正選操作時(shí)可能發(fā)現(xiàn)某一題目“預(yù)選學(xué)生人數(shù)”比列出的“預(yù)選學(xué)生名單”多或少1個(gè)人,這是因?yàn)樵诓樵冾}目表和預(yù)選表之間某一學(xué)生進(jìn)行了退選或預(yù)選操作,但這不會(huì)影響系統(tǒng)的數(shù)據(jù)一致性。
(4)對(duì)于非訪問(wèn)數(shù)據(jù)庫(kù)的、執(zhí)行較慢的程序語(yǔ)句,盡量放在事務(wù)加鎖語(yǔ)句之前,以縮短封鎖時(shí)間。例如,教師修改已經(jīng)發(fā)布的題目信息,可以將任務(wù)書(shū)上傳并存放為臨時(shí)文件(較慢)之后再進(jìn)入事務(wù),而事務(wù)內(nèi)部則根據(jù)數(shù)據(jù)庫(kù)更新是否成功,將該臨時(shí)文件替換掉原文件或刪除(較快)。
(5)實(shí)時(shí)性要求不高、封鎖對(duì)象較多的批處理操作盡量避免在并發(fā)訪問(wèn)量較大時(shí)執(zhí)行。例如,教務(wù)管理員希望每天對(duì)所有題目的互選狀況按照研究類別、所屬教師教研室等進(jìn)行批量統(tǒng)計(jì)。為此,系統(tǒng)采取了一種基于Agent(智能代理)程序[10]的批處理操作方式,即在并發(fā)訪問(wèn)量較大時(shí),僅將批處理的指令提交到數(shù)據(jù)表中,并置為“待執(zhí)行”狀態(tài);Agent程序定期自動(dòng)檢測(cè)系統(tǒng)并發(fā)狀況和該數(shù)據(jù)表,在并發(fā)訪問(wèn)量較小時(shí)自動(dòng)完成其中“待執(zhí)行”狀態(tài)的指令,并修改其狀態(tài);教務(wù)管理員下次登錄后可以查看這些指令的執(zhí)行狀態(tài)。
(6)要避免死鎖。
多個(gè)并發(fā)事務(wù)已經(jīng)分別封鎖了數(shù)據(jù)對(duì)象,同時(shí)每個(gè)事務(wù)都在請(qǐng)求對(duì)其他事務(wù)已封鎖數(shù)據(jù)對(duì)象的加鎖,形成循環(huán)“鎖沖突”現(xiàn)象,即死鎖。
在本系統(tǒng)中,假設(shè)當(dāng)前學(xué)生S1和S2都可預(yù)選3個(gè)題目,且S1已預(yù)選教師T1發(fā)布的題目t1和教師T2發(fā)布的題目t2,教師T3發(fā)布了題目t3,之后可能發(fā)生死鎖的情況列舉如下。
(1)“S2預(yù)選t1”的事務(wù)B1和“T1針對(duì)t1正選S1”的事務(wù)B2并發(fā)執(zhí)行。B1和B2都需要封鎖題目表t1記錄以確認(rèn)t1未被選滿、封鎖教師表T1記錄以確認(rèn)T1未被選滿,如果B1先封鎖題目表t1記錄,B2再封鎖教師表T1記錄,之后B1和B2都將試圖封鎖對(duì)方已封鎖的記錄,則產(chǎn)生死鎖。
(2)“T1針對(duì)t1正選S1”的事務(wù)C1和“T2針對(duì)t2正選S1”的事務(wù)C2并發(fā)執(zhí)行。C1和C2都需要封鎖題目表中的t1和t2記錄并修改其已正選或預(yù)選學(xué)生數(shù),如果C1先封鎖并修改t1記錄,C2再封鎖并修改t2記錄,之后C1和C2都將試圖封鎖對(duì)方已封鎖的記錄,則產(chǎn)生死鎖。
(3)“S1預(yù)選t3”的事務(wù) D1和“S2預(yù)選t3”的事務(wù)D2并發(fā)執(zhí)行。按照三級(jí)封鎖協(xié)議,D1和D2先后都可成功對(duì)題目表中t3記錄加共享鎖,以確認(rèn)t3未被選滿,之后它們都將試圖對(duì)該t3記錄加排他鎖以修改t3的已預(yù)選學(xué)生數(shù),則產(chǎn)生死鎖。
MySQL的InnoDB存儲(chǔ)引擎一般能自動(dòng)檢測(cè)到死鎖的發(fā)生,使其中一個(gè)事務(wù)釋放鎖并回退到起始狀態(tài),而另一個(gè)事務(wù)獲得鎖并繼續(xù)運(yùn)行。然而,如果不加以控制,死鎖會(huì)產(chǎn)生以下問(wèn)題。
(1)被回退的事務(wù)并沒(méi)有被撤銷,回退點(diǎn)之前的SQL語(yǔ)句也不會(huì)再被執(zhí)行。由于網(wǎng)站PHP程序以嵌入方式使用SQL語(yǔ)句訪問(wèn)MySQL,被回退的事務(wù)還會(huì)繼續(xù)執(zhí)行回退點(diǎn)之后的SQL語(yǔ)句,從而可能會(huì)破壞系統(tǒng)的數(shù)據(jù)一致性。
(2)死鎖是“鎖沖突”的特殊形式,由于還受到回退等因素的影響,往往會(huì)使系統(tǒng)并發(fā)性進(jìn)一步降低[8]。
除了死鎖,鎖等待超時(shí)也是并發(fā)操作可能導(dǎo)致的事務(wù)故障,其主要是指由于并發(fā)訪問(wèn)量較大等原因,發(fā)生“鎖沖突”而被迫等待的事務(wù)等待時(shí)間過(guò)長(zhǎng)(默認(rèn)值為50秒),則系統(tǒng)將取消該事務(wù)中相應(yīng)的加鎖語(yǔ)句的執(zhí)行。與死鎖情況類似,由于該加鎖語(yǔ)句之后的SQL語(yǔ)句還能夠繼續(xù)被執(zhí)行,從而可能造成數(shù)據(jù)不一致。針對(duì)這些事務(wù)故障,本系統(tǒng)主要采取了以下措施:
(1)預(yù)先對(duì)系統(tǒng)中的所有數(shù)據(jù)表進(jìn)行排序,對(duì)每個(gè)數(shù)據(jù)表中的記錄則按主碼進(jìn)行排序,而所有事務(wù)對(duì)其所涉及的數(shù)據(jù)表或記錄,只能按照預(yù)設(shè)順序申請(qǐng)加鎖。該措施可避免與上文列舉的死鎖情況(1)和(2)類似的情況。
(2)如果事務(wù)對(duì)某記錄查詢之后還要再修改,則在查詢之前一次性對(duì)該記錄申請(qǐng)加排他鎖。該措施可避免與上文列舉的死鎖情況(3)類似的情況。
(3)針對(duì)事務(wù)中所有的加鎖語(yǔ)句,能夠捕捉到死鎖和鎖等待超時(shí)等造成的異常,并且在該異常發(fā)生時(shí)撤銷整個(gè)事務(wù),給出“系統(tǒng)忙”的提示并返回之前的操作界面。該措施能防止鎖等待超時(shí)、由于系統(tǒng)改進(jìn)等原因還未設(shè)法避免的死鎖等可能造成的數(shù)據(jù)不一致。
本文所介紹的畢業(yè)論文選題系統(tǒng)于2009年9月整合到中南民族大學(xué)實(shí)驗(yàn)教學(xué)與實(shí)驗(yàn)室開(kāi)放管理系統(tǒng)[11-12](http://labsystem.scuec.edu.cn)中,已在 該校計(jì)算機(jī)科學(xué)學(xué)院、化學(xué)與材料科學(xué)學(xué)院、外語(yǔ)學(xué)院、經(jīng)濟(jì)學(xué)院等院系正常使用了4年,平均每學(xué)年完成約5 800名學(xué)生、990名教師的畢業(yè)論文選題。由于本科畢業(yè)論文參與人數(shù)多、協(xié)作性強(qiáng),在該系統(tǒng)中引入事務(wù)處理及封鎖機(jī)制,可以增強(qiáng)師生雙向選題的互動(dòng)性,充分調(diào)動(dòng)師生參與選題乃至整個(gè)畢業(yè)論文教學(xué)的積極性,進(jìn)而對(duì)畢業(yè)論文教學(xué)的順利實(shí)施和畢業(yè)論文水平的提高起到很好的促進(jìn)作用。
(
)
[1]付小龍,宣華,袁芳,等.新一代綜合教務(wù)管理系統(tǒng)技術(shù)體系的設(shè)計(jì)與實(shí)現(xiàn)[J].實(shí)驗(yàn)技術(shù)與管理,2011,28(4):95-100.
[2]王利江.基于完全學(xué)分制教務(wù)管理系統(tǒng)的改進(jìn)和完善[J].內(nèi)蒙古師范大學(xué)學(xué)報(bào):教育科學(xué)版,2012,25(3):91-93.
[3]宣華,郭大勇,羅念龍.依托信息技術(shù)的高校現(xiàn)代化教學(xué)支撐平臺(tái)[J].清華大學(xué)學(xué)報(bào):自然科學(xué)版,2009,49(8):1245-1248.
[4]許龍飛,李國(guó)和,馬玉書(shū).Web數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用[M].北京:科學(xué)出版社,2005.
[5]劉乃琦,李忠.PHP和MySQL Web應(yīng)用開(kāi)發(fā)[M].北京:人民郵電出版社,2013.
[6]薩師煊,王珊.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].3版.北京:高等教育出版社,2000.
[7]唐漢明,翟振興,蘭麗華,等.深入淺出MySQL數(shù)據(jù)庫(kù)開(kāi)發(fā)、優(yōu)化與管理維護(hù)[M].北京:人民郵電出版社,2008.
[8]牛新莊.DB2數(shù)據(jù)庫(kù)性能調(diào)整和優(yōu)化[M].北京:清華大學(xué)出版社,2009.
[9]李軍.高并發(fā) Web系統(tǒng)的設(shè)計(jì)與優(yōu)化[D].北京:北京交通大學(xué),2009.
[10]王攀,魯強(qiáng),曾紹群,等.基于 Web信息自動(dòng)獲取構(gòu)建生物信息二級(jí)數(shù)據(jù)庫(kù)[J].高技術(shù)通訊,2004,14(5):28-31.
[11]王攀,陳少平,王晶,等.基于 Web的實(shí)驗(yàn)室開(kāi)放管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代教育技術(shù),2008,18(10):101-104.
[12]王攀,王晶,陳少平.基于Web的實(shí)驗(yàn)教學(xué)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)電化教育,2010(2):115-118.